首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetProcAddress为所有函数返回0

GetProcAddress为所有函数返回0
EN

Stack Overflow用户
提问于 2013-11-23 04:00:19
回答 2查看 2.2K关注 0票数 5

首先,是的,我搜索这个问题已经有一段时间了,但是没有找到任何与我的案例相关的答案,。基本上,我试图在windows (dnsapi.dll)中获取函数的地址,而GetProcAddress则返回0。过了一会儿,我甚至创建了一个程序,它在user32.dll中简单地使用了GetProcAddress of MessageBox。同样的结果。下面是我编写的第二个程序的代码,它仍然无法工作:

代码语言:javascript
复制
#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名称解决了问题。谢谢你把这个问题联系起来。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2013-11-23 04:43:42

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

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

例如,MessageBox不存在。现有的函数是MessageBoxAMessageBoxW,其中一个用于ANSI,另一个用于UNICODE。所以你可以这样得到他们的地址:

安西:

代码语言:javascript
复制
HINSTANCE hLib = LoadLibraryA("user32.dll");
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBoxA");

UNICODE:

代码语言:javascript
复制
HINSTANCE hLib = LoadLibraryW(L"user32.dll");
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBoxW");

自动:

代码语言:javascript
复制
HINSTANCE hLib = LoadLibrary(TEXT("user32.dll"));
#ifdef UNICODE
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBoxW");
#else
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBoxA");
#endif
票数 5
EN

Stack Overflow用户

发布于 2013-11-23 04:50:46

哈瓦纳德已经给出了答案,所以不要接受我的答案(但一定要读)。

解决这一问题的一个更好的办法是定义:

代码语言:javascript
复制
#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

然后使用

代码语言:javascript
复制
GetProcAddress(hLib, TEXT(_CRT_STRINGIZE(MessageBox)));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20158358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档