我有一个从当前路径加载DLL的简单程序
#include <iostream>
#include <windows.h>
using namespace std;
auto loaddll(const char * library) {
auto dllModule = LoadLibrary(library);
if(dllModule == NULL)
throw "Can't load dll";
return dllModule;
}
int main() {
try {
auto Handle = loaddll("ISab.dll");
} catch(const char * error) {
cerr << "An Unexpected error :" << error << endl;
cerr << "Get Last Error : " << GetLastError();
}
}
加载库对于当前路径中的每个DLL都失败,但对于像User.dll
这样的DLL成功如果我运行它输出就像
An Unexpected error :Can't load dll
Get Last Error : 0
如果我指定dll的完整路径,这也会失败
答案 0 :(得分:5)
当Win32 API调用失败并设置错误代码时,必须在调用任何其他Win32 API函数之前调用GetLastError
。你不这样做。
引发异常,流式传输到cerr
等都有可能调用其他Win32 API函数,因此重置错误代码。
您的代码必须如下所示:
auto dllModule = LoadLibrary(library);
if (dllModule == NULL)
auto err = GetLastError();
获得错误代码后,您应该更好地了解无法加载模块的原因。 LoadLibrary
的常见错误代码包括:
ERROR_MOD_NOT_FOUND
表示DLL搜索无法找到该模块或其中一个依赖项。ERROR_BAD_EXE_FORMAT
总是意味着32/64位不匹配,无论是您加载的模块还是其中一个依赖项。