GetProcAddress返回0 For All Functions

时间:2013-11-23 04:00:19

标签: c winapi getprocaddress

首先是的,我已经搜索了一段时间了,找不到任何与我的案例相关的答案。基本上我试图获取一个函数的地址在一个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名称解决了问题。感谢您关联该问题。

谢谢。

2 个答案:

答案 0 :(得分:4)

一些常见的API不是函数的真实名称,包括LoadLibraryMessageBox。所有这些功能都不存在!

这是因为大多数以文本为参数的Windows API都有两个版本,一个接受ANSI文本,另一个接受UNICODE文本。您知道的那些“函数”实际上是预处理器宏,它将根据您的Visual Studio项目的默认字符集自动将您引导到正确的函数。

例如,

MessageBox不存在。存在的函数MessageBoxAMessageBoxW,一个用于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)));