首先,是的,我已经搜索了一段时间,但找不到任何与我的案例相关的答案。基本上,我试图在 Windows DLL (dnsapi.dll) 中获取一个函数的地址,而 GetProcAddress 返回 0。经过一段时间的摸索,我什至继续创建一个程序,它只使用 user32 中 MessageBox 的 GetProcAddress。 dll。同样的结果。这是我编写的第二个程序的代码,但仍然无法运行:
#include <stdio.h>
#include <Windows.h>
int main() {
HINSTANCE hLib = LoadLibrary(TEXT("user32.dll"));
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBox");
printf("%ld", MsgBoxAddr);
getchar();
return 0;
}
顺便说一句,GetLastError 返回 127,这似乎是 GetProcAddress 不起作用时返回的最常见错误,但我无法弄清楚哪里出了问题,我尝试了很多函数和 DLL,而不仅仅是这对。
谢谢。 :)
编辑:
链接的文章解决了我的问题,我尝试过的函数都有 unicode 和 anis 版本(w 和 a)。使用完整的 API 名称解决了问题。感谢您链接该问题。
谢谢。
一些常用的API并不是函数的真实名称,包括LoadLibrary
和MessageBox
。所有这些功能都不存在!
那是因为大多数将文本作为参数的 Windows API 都有两个版本,一个接受 ANSI 文本,另一个接受 UNICODE 文本。您知道的那些“函数”实际上是预处理器宏,它们会根据您的 Visual Studio 项目的默认字符集自动将您路由到正确的函数。
MessageBox
例如,不存在。存在的是函数 MessageBoxA
和 MessageBoxW
,一个用于 ANSI,另一个用于 UNICODE。所以这就是您将如何获得他们的地址:
美国标准:
HINSTANCE hLib = LoadLibraryA("user32.dll");
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBoxA");
统一码:
HINSTANCE hLib = LoadLibraryW(L"user32.dll");
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBoxW");
自动:
HINSTANCE hLib = LoadLibrary(TEXT("user32.dll"));
#ifdef UNICODE
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBoxW");
#else
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBoxA");
#endif