我尝试使用LoadLibrary和GetProcAddress加载dll。 LoadLibrary返回一个有效的句柄,但我对GetProcAddress的调用返回NULL。对GetLastError的调用返回87,即ERROR_INVALID_PARAMETER。我验证了传递给GetProcAddress的函数名称与在dll上运行dumpbin /exports
时返回的函数名称相同。不幸的是,这是为了工作,所以我不能包含实际的代码。但这是一个编辑版本,可以让您了解我正在做什么。
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文件中,该文件被加载到目标上。我尝试使用旧的dll中的几个函数和那些有效的GetProcAddress。因此,即使我使用新dll的路径调用LoadLibrary,它实际上只是加载已经在目标上的dll。任何人都可以确认这会发生什么吗?
回答以前的问题
当Windows CE加载DLL时,所有路径信息都会被忽略 确定DLL是否已加载。这意味着一个DLL用 相同的名称,但不同的路径只能加载一次。在 另外,以.cpl扩展名结尾的模块被视为 扩展名为.dll。
答案 0 :(得分:1)
是的,这是一个常见的陷阱。如果您没有提供DLL的完整路径,LoadLibrary将返回已加载的同名DLL的句柄。
来自MSDN:
如果lpFileName不包含路径,并且有多个加载的模块具有相同的基本名称和扩展名,则该函数将返回首先加载的模块的句柄。
我相信你可以通过提供LoadLibrary的绝对路径来获得你想要的精确DLL。