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