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

blu*_*gon 2 c++ windows dll winapi

我有一个简单的程序,从当前路径加载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();
    }
}
Run Code Online (Sandbox Code Playgroud)

加载库对于当前路径中的每个DLL都会失败,但对于像User.dll这样的DLL会成功

如果我运行它输出将是

An Unexpected error :Can't load dll
Get Last Error : 0
Run Code Online (Sandbox Code Playgroud)

如果我指定dll的完整路径,这也会失败

Dav*_*nan 6

当Win32 API调用失败并设置错误代码时,您必须GetLastError在调用任何其他Win32 API函数之前调用.你不这样做.

引发异常,流式传输cerr等都可能会调用其他Win32 API函数,因此重置错误代码.

您的代码必须如下所示:

auto dllModule = LoadLibrary(library);
if (dllModule == NULL)
    auto err = GetLastError();
Run Code Online (Sandbox Code Playgroud)

一旦得到错误代码,您应该更好地理解无法加载模块的原因.常见错误代码LoadLibrary包括:

  • ERROR_MOD_NOT_FOUND 这意味着DLL搜索无法找到模块或其中一个依赖项.
  • ERROR_BAD_EXE_FORMAT 这总是意味着32/64位不匹配,无论是加载模块还是其中一个依赖项.