我在 Windows 上用 C++ 编写了代码。当我将其编译为 x64 时,我的代码会编译和链接,但当我将构建配置更改为 x86 时不会。
失败是链接错误。
我正在使用来自 ntdll 的函数 RtlIsNameInExpression。
当我在 32 位模式下编译它时,出现未解决的外部链接错误 (LNK2019)。
任何想法为什么会发生这种情况?
10倍
首先-您如何声明函数以及找不到链接器的符号?
声明必须是
extern "C" NTSYSAPI BOOLEAN NTAPI RtlIsNameInExpression(
_In_ PCUNICODE_STRING Expression,
_In_ PCUNICODE_STRING Name,
_In_ BOOLEAN IgnoreCase,
_In_opt_ PWCH UpcaseTable
);
如果您从此处复制粘贴,我可以猜到您错过了NTAPI
ie关键字。对于 x64 仅存在一种调用约定,但对于 x86 存在不同的调用约定,例如。这可以解释为什么这个发现但没有发现__stdacall
__stdcall
__cdecl
x64
x86
什么错误给你链接器(不是编译器!)?未解析的外部符号__imp__RtlIsNameInExpression
?(如果是,你真的忘记了__stdcall
设置)还是__imp__RtlIsNameInExpression@16
?在这种情况下,您声明函数正确,但您ntdll.lib
不包含此符号。(也许你用旧ntdll.lib
的 xp ?) 简单地搜索__imp__RtlIsNameInExpression@16
字符串ntdll[p].lib
- 找到了吗?如果没有,我猜你有旧(xp)版本的 ntdll。
答案在该功能的在线文档中:
此函数没有关联的头文件。Microsoft Windows Driver Kit (WDK) 中提供了关联的导入库 Ntdll.lib。您还可以使用 LoadLibrary 和 GetProcAddress 函数调用此函数以动态链接到 Ntdll.dll。
如果无法将 WDK 中的 ntdll.lib 文件添加到链接命令中,则需要使用 LoadLibrary-GetProcAddress 方法。
同样来自文档的同一部分:
Winternl.h 中的功能和结构是操作系统内部的,可能会从一个 Windows 版本到下一个版本发生变化,甚至可能在每个版本的服务包之间发生变化。为了保持应用程序的兼容性,您应该改用等效的公共函数。头文件 Winternl.h 和每个函数的文档中提供了更多信息。