我刚刚尝试了以下代码(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)。
我该如何纠正这个问题?
谢谢!
你有一个字符串文字,由窄字符组成。你的LoadLibrary
电话显然希望广泛的角色。类型转换不是从一个转换为另一个的方式。使用L
前缀获取宽字符串文字:
LoadLibrary(L"ntdll.dll")
类型转换告诉编译器你的char const*
实际上是wchar_t const*
,这不是真的。编译器信任你并且无论如何都将指针传递给LoadLibrary
,但是当被解释为宽字符串时,你传递的东西是无意义的。它不代表系统上任何文件的名称,因此API会正确报告它找不到该模块。
你应该使用LoadLibrary(_T("ntdll.dll"))
LPCWSTR只是将基于字符的字符串指针强制转换为宽字符串指针。
除了必须通过使用string
前缀(已在接受的答案中提到)将路径wchar_t const*
转换为L
。根据我最近几个小时的经验:
值得一提的是,LoadLibrary
函数不会自动加载目标库(DLL)的依赖项。换句话说,如果你试图加载依赖于库Y的库X,你应该做LoadLibrary(Y)
,然后LoadLibrary(X)
,否则加载库X将失败,你将得到错误126
。