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

VC++-MFC:LoadLibrary返回无效句柄0x10000000,mfc,visual-c++,loadlibrary,Mfc,Visual C++,Loadlibrary,我无法使用LoadLibrary()API加载test.dll(在VC++-MFC中)。我使用GetLastError()获得错误代码126(未找到模块)。 通过dependency walker,我知道我的test.dll依赖于“xerces-c_2_7.dll”和“Xalan-c_1_10.dll”。这些DLL已存在于与exe相同的路径上。 我仍然得到了错误。 因此,我尝试使用LoadLibrary()加载上述两个第三方DLL,它将句柄返回为0x10000000。通过GetLastError

我无法使用
LoadLibrary()
API加载test.dll(在VC++-MFC中)。我使用
GetLastError()
获得错误代码
126(未找到模块)
。 通过dependency 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);

从你的问题中,我推断:

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

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

请记住,您必须在
LoadLibrary
调用后立即调用:来自MSDN文档:

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

这很可能是依赖项/路径解析问题(即,
LoadLibrary
找不到请求的映像)。因此,您有两种选择:

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

  • 请将dll放入Windows\System32文件夹,然后重试。如果这样做有效,那么您可以确定您遇到了路径问题。阅读上的MSDN页面--有点混乱,但有一些容易忽略的细节

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

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

  • 一旦完成,做一个好公民,打电话给免费图书馆


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

If it is a your DLL, 
您应该能够很容易地看到代码中的依赖DLL及其确切路径

If it is third party DLL,
您需要尝试windows路径、程序文件路径、测试DLL路径等。。。记住,这只是一次尝试。 有时,它们可能会引用仅创建者知道的路径(如果没有文档记录,则为DLL)


希望这个答案有帮助

我不明白这个问题。根据MSDN,任何非null的返回值都表示成功,0x10000000为非null。@erikkallen:IIUC,OP可以单独加载Xerces和Xalan,但不能加载
test.dll