我有一个从当前路径加载 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 的完整路径,这也会失败
最佳答案
当 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 位不匹配,与您加载的模块或其依赖项之一不匹配。
关于c++ - 当前路径的 loadlibrary 失败,GetLastError() == 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46156284/