首先是的,我已经搜索了一段时间了,找不到任何与我的案例相关的答案。基本上我试图获取一个函数的地址在一个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;
}
BTW GetLastError返回127,这似乎是GetProcAddress不起作用时返回的最常见错误,但我无法弄清楚出了什么问题,我尝试过很多函数和DLL,而不仅仅是这些。
感谢。 :)
编辑: 链接的文章解决了我的问题,我尝试的函数都有unicode和anis版本(w和a)。使用完整的API名称解决了问题。感谢您关联该问题。
谢谢。
答案 0 :(得分:4)
一些常见的API不是函数的真实名称,包括LoadLibrary
和MessageBox
。所有这些功能都不存在!
这是因为大多数以文本为参数的Windows API都有两个版本,一个接受ANSI文本,另一个接受UNICODE文本。您知道的那些“函数”实际上是预处理器宏,它将根据您的Visual Studio项目的默认字符集自动将您引导到正确的函数。
例如, MessageBox
不存在。存在的函数MessageBoxA
和MessageBoxW
,一个用于UNICODE的ANSI其他函数。这就是你将如何得到他们的地址:
ANSI:
HINSTANCE hLib = LoadLibraryA("user32.dll");
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBoxA");
UNICODE:
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
答案 1 :(得分:2)
Havenard已经给出了答案,所以不要接受我的(但请仔细阅读)。
解决问题的更好方法是定义:
#ifndef _CRT_STRINGIZE // Might be already defined in crtdefs.h, but if not...
#define __CRT_STRINGIZE(Value) #Value
#define _CRT_STRINGIZE(Value) __CRT_STRINGIZE(Value)
#endif
然后使用
GetProcAddress(hLib, TEXT(_CRT_STRINGIZE(MessageBox)));