VC ++ - MFC:LoadLibrary返回无效句柄0x10000000

时间:2009-10-26 12:49:26

标签: mfc visual-c++ loadlibrary

我无法使用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相同的路径上。 我仍然得到错误。 所以我尝试使用LoadLibrary()加载上述第三方dll,其返回句柄为0x10000000。到GetLastError()我正在

error code 6 (Invalid Handle).

有人可以指导我为什么会收到无效处理错误吗?

以下是代码snipet:

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);

2 个答案:

答案 0 :(得分:1)

提炼你的问题,我收集:

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

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

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

  

当函数的返回值指示此类调用将返回有用数据时,应立即调用GetLastError函数。这是因为有些函数在成功时调用SetLastError为零,消除了最近失败函数设置的错误代码。

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

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

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

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

  • LoadLibrary的调用中指定dll的完整路径。如果路径名包含空格,则可能会遇到问题(我记得在内存中,请查看MSDN)。

  • 完成后,成为一名好公民并致电FreeLibrary

答案 1 :(得分:0)

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

If it is a your DLL, 

您应该能够轻松地在代码和代码中看到相关的DLL。它的确切路径。

If it is third party DLL,

你需要尝试Windows路径,程序文件路径,测试DLL路径等...记住它只是一个尝试。 有时他们可能会引用创建者只知道的路径如果没有记录

希望这个答案有所帮助!