簡體   English   中英

C ++ Windows代碼鏈接為64位,但不是32位

[英]C++ windows code links in 64bit but not in 32bit

我在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__stdacall關鍵字。 對於x64,僅存在一個調用約定,但是對於x86,例如__stdcall__cdecl之間存在區別。 這可以解釋為什么在x64找到但在x86找不到

什么錯誤給您的鏈接程序(不是編譯器!)? 未解析的外部符號__imp__RtlIsNameInExpression嗎? (如果是,您真的忘記了__stdcall集)或__imp__RtlIsNameInExpression@16嗎? 在這種情況下,您聲明函數正確,但您的ntdll.lib不包含此符號。 (可能是您將舊的ntdll.lib用於xp嗎?)只需像在ntdll[p].lib一樣搜索__imp__RtlIsNameInExpression@16字符串-是否找到了? 如果沒有,我想你有舊的(xp)版本的ntdll。

答案在該功能的在線文檔中:

該函數沒有關聯的頭文件。 關聯的導入庫Ntdll.lib在Microsoft Windows驅動程序工具包(WDK)中可用。 您還可以使用LoadLibrary和GetProcAddress函數調用此函數,以動態鏈接到Ntdll.dll。

如果無法將WDK中的ntdll.lib文件添加到鏈接命令中,則需要使用LoadLibrary-GetProcAddress方法。

同樣在文檔的同一部分:

Winternl.h中的功能和結構是操作系統的內部組件,可能會從一個Windows版本更改為另一個Windows版本,甚至可能在每個版本的Service Pack之間更改。 為了保持應用程序的兼容性,您應該使用等效的公共函數。 有關更多信息,請參見頭文件Winternl.h和每個功能的文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM