我正在尝试使用 LoadLibrary 和 GetProcAddress 加载 dll。LoadLibrary 返回一个有效的句柄,但我对 GetProcAddress 的调用返回 NULL。调用 GetLastError 返回 87,即 ERROR_INVALID_PARAMETER。我验证了我传递给 GetProcAddress 的函数名称与dumpbin /exports
在 dll 上运行时返回的函数名称相同。不幸的是,这是为了工作,所以我不能包含实际的代码。但这里有一个经过编辑的版本,可以让您了解我在做什么。
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,它有一些我需要的额外功能;不幸的是,我无法更新旧的 dll。这个新的 dll 和使用该 dll 的应用程序被打包到一个 cab 文件中,该文件被加载到目标上。我用旧 dll 中的几个函数尝试了 GetProcAddress,并且这些函数有效。因此,似乎即使我使用新 dll 的路径调用 LoadLibrary,它实际上只是在加载目标上已经存在的 dll。谁能确认这会发生什么?
回答上一个问题
当 Windows CE 加载 DLL 时,在确定 DLL 是否已加载时将忽略所有路径信息。这意味着同名但路径不同的 DLL 只能加载一次。此外,以扩展名 .cpl 结尾的模块被视为扩展名是 .dll。