c++ - 当前路径的 loadlibrary 失败,GetLastError() == 0

标签 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 的完整路径,这也会失败

最佳答案

当 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/

相关文章:

C++编程迭代和递归

c++ - Visual Studio 的 "C++ Variables"中的 "Display Items"是什么?

c# - 如何避免或限制 MDI 子窗体菜单条与 MDI 父窗体菜单条合并?

php - 有没有办法用 php.exe 和友好的 GUI 运行 php 文件?

windows - SetThreadAffinityMask 被忽略....有什么想法吗?

windows - 如何在 Win32 中自定义选项卡控件的外观?

c++ - 编译C dll部署MATLAB代码时出现错误C2371

c++ - 错误 : no matching function for call to 'sort(..., ..., <unresolved overloaded function type>)'

windows - 使用包含双引号的密码提取存档

c++ - 获取lnk2019 VC++