LoadLibrary returning Null

LoadLibrary returning Null

本文关键字:Null returning LoadLibrary      更新时间:2023-10-16

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

#include "windows.h"
#include "stdio.h"
int main() {
    HMODULE hNtdll;
    hNtdll = LoadLibrary(LPCWSTR("ntdll.dll"));
    printf("%08xn", hNtdll);
}

我得到的输出是00000000。根据文档,当函数失败时返回NULL。我尝试使用GetLastError和错误代码是126(0x7e,错误模式未找到)。

如何纠正这个问题?

谢谢!

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

LoadLibrary(L"ntdll.dll")

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

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

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