GetProcAddress返回NULL

时间:2014-06-18 15:10:22

标签: dll windows-ce getprocaddress

我尝试使用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。

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

1 个答案:

答案 0 :(得分:1)

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

来自MSDN

  

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

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