对于GetLastError()== 0的当前路径,loadlibrary失败

时间:2017-09-11 12:54:05

标签: c++ windows winapi dll

我有一个从当前路径加载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的完整路径

,这也会失败

1 个答案:

答案 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位不匹配,无论是您加载的模块还是其中一个依赖项。