【问题标题】: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。