c - GetProcAddress 为所有函数返回 0

标签 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;
}

顺便说一句,GetLastError 返回 127,这似乎是 GetProcAddress 不起作用时返回的最常见错误,但我无法弄清楚哪里出了问题,我尝试了很多函数和 DLL,而不仅仅是这对。

谢谢。 :)

编辑: 链接的文章解决了我的问题,我尝试过的函数都有 unicode 和 anis 版本(w 和 a)。使用完整的 API 名称解决了问题。感谢您链接该问题。

谢谢。

最佳答案

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

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

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

关于c - GetProcAddress 为所有函数返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20158358/

相关文章:

c - 如何动态加载每个需要的函数

c# - 如何动态加载dll并向其传递/获取值?

c - 重用缓冲区指针_before_ free

c - 我们如何正确地多次动态分配内存呢?

c - 我需要在第 17 行的哪里放置额外的分号

c# - 如何获取打开的资源管理器窗口的 PIDL?

c - 如何从控制台获取密码字符,但将它们显示为星号

delphi - 将字符串传递给已运行的应用程序实例

c++ - 为什么没有 InterlockedExchange Subtract 64?

c++ - “dll_file”可能是 '0' : This does not adhere to the specification for the function 'GetProcAddress'