LoadLibrary返回Null

问题描述 投票:3回答:3

我刚刚尝试了以下代码(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
3个回答
12
投票

你有一个字符串文字,由窄字符组成。你的LoadLibrary电话显然希望广泛的角色。类型转换不是从一个转换为另一个的方式。使用L前缀获取宽字符串文字:

LoadLibrary(L"ntdll.dll")

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


2
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.