首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetProcAddress返回空

GetProcAddress返回空
EN

Stack Overflow用户
提问于 2014-06-18 15:10:21
回答 1查看 3.2K关注 0票数 4

我正在尝试使用LoadLibrary和GetProcAddress加载一个dll。LoadLibrary返回一个有效句柄,但我对GetProcAddress的调用返回NULL。对GetLastError的调用返回87,即ERROR_INVALID_PARAMETER。我验证了传递给GetProcAddress的函数名与在dll上运行dumpbin /exports时返回的相同。很偶然,这是为了工作,所以我不能包括实际的代码。但这里有一个经过修改的版本,让你知道我在做什么。

代码语言:javascript
复制
HINSTANCE hDLL = NULL;

hDLL = LoadLibrary(L"<PATH TO DLL>");

if (hDLL == NULL)
{
    // error handling code
}

g_var1 = (VAR1_TYPE) GetProcAddress(hDLL, L"Function1Name");
g_var2 = (VAR2_TYPE) GetProcAddress(hDLL, L"Function2Name");

if (!g_var1 ||
    !g_var2 )
{
    // error handling code
}

我在SO和其他论坛上看过许多相关的问题,但通常情况下,问题是由于C++名称的损坏。由于我使用的名称与dumpbin显示的名称相同,所以我不认为这是我的问题。有什么想法吗?

更新

我想我可能已经把问题缩小了。目标上有一个现有的这个dll的旧版本(这是一个嵌入式WinCE解决方案)。但是我需要使用一个新版本的dll,它有一些我需要的额外功能;unfortuanatley,我不能更新旧的dll。这个新的dll和使用dll的应用程序被打包到一个cab文件中,这个cab文件被加载到目标上。我用旧dll中的几个函数尝试了GetProcAddress,这些函数都能工作。因此,尽管我使用新dll的路径调用LoadLibrary,但它实际上只是加载已经在目标上的dll。有人能证实这是会发生的事吗?

对先前问题的回答

当Windows加载DLL时,在确定DLL是否已加载时,将忽略所有路径信息。这意味着具有相同名称但不同路径的DLL只能加载一次。此外,以扩展.cpl结尾的模块将被视为扩展为.dll。

来源:http://msdn.microsoft.com/en-us/library/ms886736.aspx

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-18 17:12:52

是的,这是一个常见的陷阱。如果不为DLL提供完整的路径,LoadLibrary将返回已加载的同名DLL的句柄。

来自MSDN

如果lpFileName不包括路径,并且有多个加载模块,具有相同的基本名称和扩展名,则函数将返回首先加载的模块的句柄。

我相信您可以通过提供LoadLibrary的绝对路径来获得您想要的DLL。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24289101

复制
相关文章

相似问题

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