我无法使用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);
答案 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页面 - 这有点令人困惑,但有一些细节很容易遗漏。
使用GetCurrentDirectory
和SetCurrentDirectory
切换到应用程序的执行文件夹和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路径等...记住它只是一个尝试。 有时他们可能会引用创建者只知道的路径如果没有记录)
希望这个答案有所帮助!