我有一个简单的程序从当前path加载一个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(); } }
加载库在当前path中的每个DLL都失败,但像User.dll一样成功执行DLL
如果我跑它输出将像
An Unexpected error :Can't load dll Get Last Error : 0
这也失败,如果我指定完整的path到DLL
当Win32 API调用失败并设置错误代码时,必须在调用任何其他Win32 API函数之前调用GetLastError
。 你不这样做。
引发异常, cerr
等都可能调用其他Win32 API函数,因此重置错误代码。
您的代码必须如下所示:
auto dllmodulee = LoadLibrary(library); if (dllmodulee == NULL) auto err = GetLastError();
一旦你有错误代码,你应该更好地了解为什么模块不能被加载。 LoadLibrary
常见错误代码包括:
ERROR_MOD_NOT_FOUND
,这意味着DLL搜索无法找到该模块或其某个依赖关系。 ERROR_BAD_EXE_FORMAT
总是意味着32/64位不匹配,无论是加载的模块还是其依赖项之一。