LoadLibrary GetProcAddress - 为什么这样做?

LoadLibrary GetProcAddress - why does this work?

提问人:Pieter Jansen 提问时间:11/17/2023 最后编辑:Remy LebeauPieter Jansen 更新时间:11/18/2023 访问量:61

问:

当我使用具有函数名称的 Visual Studio Code 运行此代码时,它可以工作,并且它为我提供了指向该函数的指针。"MessageBoxA"

但是,例如,当我将函数的名称更改为并保存它时,它仍然为我提供了相同的函数地址。"MessageBoxATEST"

这怎么可能(因为这个函数不存在)?user32.dll

例如,当我将DLL的名称更改为时,它会给我错误,这是应该的。User32TEST.dllFunction not loaded ....

谁能帮忙?

#include <windows.h>
#include <stdio.h>

typedef BOOL(*func_pointer)(LPSTR, LPCSTR);
int main () {

    HMODULE Handle_DLL = LoadLibrary("User32.dll");
    func_pointer Pointer = (func_pointer)(Handle_DLL,"MessageBoxATEST");

    if (Handle_DLL == NULL || Pointer == NULL){
        DWORD error = GetLastError();
        printf("Function not loaded into memory %d\n", error);
        return 1;
    }
    else{
        printf("Function address: %p\n", (void*)Pointer);
        FreeLibrary(Handle_DLL);
        return 0;
    }
}
c Windows WinAPI 加载库 getprocaddress

评论


答:

7赞 Ben Voigt 11/17/2023 #1

使用函数名称,它确实有效,它为我提供了指向该函数的指针"MessageBoxA"

不,它没有。

例如,当我将函数的名称更改为并保存它时,它仍然为我提供了相同的函数地址"MessageBoxATEST"

它从来都不是函数地址。

你忘了实际打电话.您现在拥有的是(在考虑逗号运算符的行为之后),它显然不是 NULL 指针。GetProcAddress(func_pointer)"MessageBoxATest"

评论

0赞 Pieter Jansen 11/18/2023
由于某种原因,我忘记了添加 getprocaddress,现在我确实添加了它并且它有效,当我制作 MessageBoxTEST 时,它不起作用,因为它应该起作用。谢谢