首先,是的,我搜索这个问题已经有一段时间了,但是没有找到任何与我的案例相关的答案,,。基本上,我试图在windows (dnsapi.dll)中获取函数的地址,而GetProcAddress则返回0。过了一会儿,我甚至创建了一个程序,它在user32.dll中简单地使用了GetProcAddress of MessageBox。同样的结果。下面是我编写的第二个程序的代码,它仍然无法工作:
#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名称解决了问题。谢谢你把这个问题联系起来。
谢谢。
发布于 2013-11-23 04:43:42
一些常见的API不是函数的实名,包括LoadLibrary和MessageBox。所有这些功能都不存在!
这是因为大多数以文本为参数的Windows都有两个版本,一个版本接受ANSI文本,另一个版本接受UNICODE文本。这些“函数”实际上是预处理宏,它将根据Visual项目的默认字符集自动将您路由到正确的函数。
例如,MessageBox不存在。现有的函数是MessageBoxA和MessageBoxW,其中一个用于ANSI,另一个用于UNICODE。所以你可以这样得到他们的地址:
安西:
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发布于 2013-11-23 04:50:46
哈瓦纳德已经给出了答案,所以不要接受我的答案(但一定要读)。
解决这一问题的一个更好的办法是定义:
#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)));https://stackoverflow.com/questions/20158358
复制相似问题