4

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

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

4

1 回答 1

1

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

来自MSDN

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

我相信您可以通过提供 LoadLibrary 的绝对路径来获得所需的确切 DLL。

于 2014-06-18T17:12:52.983 回答