0

我无法使用LoadLibrary()API 加载我的 test.dll(在 VC++ - MFC 中)。我126 (Module not found)使用GetLastError(). 通过依赖walker,我知道我的test.dll 依赖于“xerces-c_2_7.dll”和“Xalan-C_1_10.dll”。这些 dll 已经存在于与 exe 相同的路径上。我仍然收到错误消息。所以我尝试加载上述两个第三方 dll,使用LoadLibrary()返回的句柄为0x10000000. 通过GetLastError()我得到

error code 6 (Invalid Handle).

谁能指导我为什么会收到 Invalid Handle 错误?

下面是代码片段:

HINSTANCE hLib = LoadLibrary(_T("Xalan-C_1_10"));
TCHAR szMessage[MAX_PATH];
FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS|
    FORMAT_MESSAGE_FROM_SYSTEM,
    NULL, GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
    szMessage, MAX_PATH, NULL);
    hLib = LoadLibrary(_T("xerces-c_2_7"));
FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS|
    FORMAT_MESSAGE_FROM_SYSTEM,
    NULL, GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
    szMessage, MAX_PATH, NULL);
4

2 回答 2

1

提炼你的问题,我收集:

  • 您可以单独加载 Xerces 和 Xalan,但不能加载 test.dll 文件(它引用其他 dll)

  • GetLastError()加载 Xerces 或 Xalan 时返回的值可能会误导您

请记住,您必须在通话GetLastError()后立即LoadLibrary致电:来自 MSDN 文档:

当函数的返回值表明这样的调用将返回有用的数据时,您应该立即调用 GetLastError 函数。这是因为某些函数在成功时调用 SetLastError 时使用零,从而消除了最近失败函数设置的错误代码。

这很可能是依赖/路径解析问题(即LoadLibrary找不到请求的图像)。所以,你有两个选择:

  • test.dll/Xerces/Xalan 是否有其他尚未复制到可执行文件文件夹的依赖项?

  • 将 dll 放入 Windows\System32 文件夹,然后重试。如果这可行,那么您可以确定您遇到了路径问题。阅读 MSDN 页面LoadLibrary——这有点令人困惑,但有些细节很容易忽略。

  • 使用GetCurrentDirectoryandSetCurrentDirectory切换应用程序的执行文件夹和 dll 的驻留文件夹

  • 在对 的调用中指定 dll 的完整路径LoadLibrary。如果路径名包含空格,您可能会遇到问题(我从记忆中回忆起,请与 MSDN 核对)。

  • 一旦完成,成为一个好公民并打电话FreeLibrary

于 2009-10-26T13:46:36.750 回答
0

test.dll 是您的 DLL 还是第三方 DLL?

If it is a your DLL, 

您应该能够很容易地看到代码中依赖的 DLL 及其确切路径。

If it is third party DLL,

您需要尝试 windows 路径、程序文件路径、您的测试 DLL 路径等...记住这只是一个尝试。有时他们可能指的是只有创建者才知道的路径(如果没有记录

希望这个答案有帮助!

于 2010-04-15T09:22:48.110 回答