C ++ windows代码链接在64位但不在32位

时间:2017-03-13 15:40:59

标签: c++ winapi ntdll

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

失败是链接错误。

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

当我在32位模式下编译它时,我得到一个未解析的外部链接错误(LNK2019)。

为什么会出现这种情况的任何想法?

10倍

2 个答案:

答案 0 :(得分:3)

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

声明必须是

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

如果您从here进行复制粘贴,我猜您错过NTAPI__stdacall个关键字。 for x64只存在一个调用约定,但对于x86,例如__stdcall__cdecl之间存在差异。这可以解释为什么在x64中找到但在x86

中找不到的内容

什么错误给你链接器(不是编译器!)?未解决的外部符号__imp__RtlIsNameInExpression? (如果是,你真的忘了__stdcall设置)或__imp__RtlIsNameInExpression@16?在这种情况下,您声明函数是正确的,但您的ntdll.lib不包含此符号。 (可能你使用旧的ntdll.lib 对于XP? )只需在__imp__RtlIsNameInExpression@16中搜索ntdll[p].lib字符串 - 是否找到了?如果没有,我猜你有旧的(xp)版本的ntdll。

答案 1 :(得分:0)

答案在于该职能的在线documentation

  

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

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

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

  

Winternl.h中的函数和结构是操作系统的内部函数,可能会从一个Windows版本更改为另一个版本,甚至可能在每个版本的Service Pack之间。要保持应用程序的兼容性,您应该使用等效的公共函数。有关详细信息,请参见头文件Winternl.h以及每个函数的文档。