【问题标题】:LoadLibrary returning NullLoadLibrary 返回 Null
【发布时间】:2011-12-22 07:17:19
【问题描述】:

我刚刚尝试了以下代码(windows xp sp3,vs2010)并且 LoadLibrary 似乎返回 Null。

#include "windows.h"
#include "stdio.h"

int main() {
    HMODULE hNtdll;
    hNtdll = LoadLibrary(LPCWSTR("ntdll.dll"));
    printf("%08x\n", hNtdll);
}

我得到的输出是00000000。根据docs,函数失败时返回NULL。我尝试使用GetLastError,错误代码是126(0x7e, Error Mod Not Found)。

我该如何解决这个问题?

谢谢!

【问题讨论】:

    标签: c++ visual-studio-2010 visual-c++ loadlibrary


    【解决方案1】:

    你有一个字符串文字,它由窄字符组成。您的 LoadLibrary 调用显然需要宽字符。类型转换不是从一种转换到另一种的方法。使用 L 前缀获取宽字符串文字:

    LoadLibrary(L"ntdll.dll")
    

    类型转换告诉编译器你的char const* 真的是wchar_t const*,这不是真的。编译器信任您并将指针传递给LoadLibrary,但是当解释为宽字符串时,您传递的东西是无意义的。它不代表系统上任何文件的名称,因此 API 正确报告它找不到模块。

    【讨论】:

      【解决方案2】:

      您应该使用LoadLibrary(_T("ntdll.dll")) LPCWSTR 只是将基于字符的字符串指针转换为宽字符串指针。

      【讨论】:

        【解决方案3】:

        除了需要使用 L 前缀(已在接受的答案中提到)将路径 string 转换为 wchar_t const* 之外。根据我过去几个小时的经验:
        值得一提的是,LoadLibrary 函数不会自动加载预期库 (DLL) 的依赖项。也就是说,如果你尝试加载依赖于库Y的库X,你应该先LoadLibrary(Y),然后LoadLibrary(X),否则加载库X会失败,你会得到错误126

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-06
          • 1970-01-01
          • 1970-01-01
          • 2019-12-16
          • 2017-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多