-1

我在 Windows 上用 C++ 编写了代码。当我将其编译为 x64 时,我的代码会编译和链接,但当我将构建配置更改为 x86 时不会。

失败是链接错误。

我正在使用来自 ntdll 的函数 RtlIsNameInExpression。

当我在 32 位模式下编译它时,出现未解决的外部链接错误 (LNK2019)。

任何想法为什么会发生这种情况?

10倍

4

2 回答 2

3

首先-您如何声明函数以及找不到链接器的符号?

声明必须是

extern "C" NTSYSAPI BOOLEAN NTAPI RtlIsNameInExpression(
                               _In_     PCUNICODE_STRING Expression,
                               _In_     PCUNICODE_STRING Name,
                               _In_     BOOLEAN         IgnoreCase,
                               _In_opt_ PWCH            UpcaseTable
                               );

如果您从此处复制粘贴,我可以猜到您错过了NTAPIie关键字。对于 x64 仅存在一种调用约定,但对于 x86 存在不同的调用约定,例如。这可以解释为什么这个发现但没有发现__stdacall__stdcall__cdeclx64x86

什么错误给你链接器(不是编译器!)?未解析的外部符号__imp__RtlIsNameInExpression?(如果是,你真的忘记了__stdcall设置)还是__imp__RtlIsNameInExpression@16?在这种情况下,您声明函数正确,但您ntdll.lib不包含此符号。(也许你用旧ntdll.lib 的 xp ?) 简单地搜索__imp__RtlIsNameInExpression@16字符串ntdll[p].lib- 找到了吗?如果没有,我猜你有旧(xp)版本的 ntdll。

于 2017-03-13T16:27:35.103 回答
0

答案在该功能的在线文档中:

此函数没有关联的头文件。Microsoft Windows Driver Kit (WDK) 中提供了关联的导入库 Ntdll.lib。您还可以使用 LoadLibrary 和 GetProcAddress 函数调用此函数以动态链接到 Ntdll.dll。

如果无法将 WDK 中的 ntdll.lib 文件添加到链接命令中,则需要使用 LoadLibrary-GetProcAddress 方法。

同样来自文档的同一部分:

Winternl.h 中的功能和结构是操作系统内部的,可能会从一个 Windows 版本到下一个版本发生变化,甚至可能在每个版本的服务包之间发生变化。为了保持应用程序的兼容性,您应该改用等效的公共函数。头文件 Winternl.h 和每个函数的文档中提供了更多信息。

于 2017-03-13T15:59:52.483 回答