“我想使用 GetProcAddress 來獲取 CreateWindow 或者 ExitWindows 的調用地址,但是沒有成功。為什么?”通常,他們當時是在嘗試編寫平臺調用(P/Invoke)相關的代碼,因為從底層的角" />

AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

為什么不能通過GetProcAddress調用CreateWindow?

來源: 責編: 時間:2023-12-08 09:13:26 238觀看
導讀有時候,我看到有些人在折騰這樣一個問題:
“我想使用 GetProcAddress 來獲取 CreateWindow 或者 ExitWindows 的調用地址,但是沒有成功。為什么?”通常,他們當時是在嘗試編寫平臺調用(P/Invoke)相關的代碼,因為從底層的角

有時候,我看到有些人在折騰這樣一個問題:
“我想使用 GetProcAddress 來獲取 CreateWindow 或者 ExitWindows 的調用地址,但是沒有成功。為什么?”
pPS28資訊網——每日最新資訊28at.com

通常,他們當時是在嘗試編寫平臺調用(P/Invoke)相關的代碼,因為從底層的角度來看,平臺調用是通過 GetProcAddress 來實現的。pPS28資訊網——每日最新資訊28at.com

問題來了:為什么 GetProcAddress 不能用在這些函數上呢?pPS28資訊網——每日最新資訊28at.com

原因是:它們(CreateWindow 或 ExitWindows)并非真正的導出函數,如果你查看對應的頭文件,則會看到這樣的宏定義。pPS28資訊網——每日最新資訊28at.com

pPS28資訊網——每日最新資訊28at.com

事實上,CreateWindow 是一個雙重宏定義,首先它會根據當前是否定義了 UNICODE 來展開為 CreateWindowA 或者 CreateWindowW。然后,這些類似于函數的宏會再次被展開為真正的導出函數 CreateWindowExA 或者 CreateWindowExW。pPS28資訊網——每日最新資訊28at.com

如果包含 winuser.h 頭文件,則所有這些都由編譯器自動處理,但如果出于某種原因,您希望為類似函數的宏(如 CreateWindow)使用 GetProcAddress,則必須手動展開宏以查看實際函數是什么,并將該函數名稱傳遞給 GetProcAddress。pPS28資訊網——每日最新資訊28at.com

上述原理也適用于內聯函數。這些函數無法通過 GetProcAddress 獲取,因為它們根本不會導出,它們在頭文件中作為源代碼提供給您調用。pPS28資訊網——每日最新資訊28at.com

請注意,某些內容是真正的函數還是類似函數的宏(或內聯函數)可能取決于您的目標平臺。例如,GetWindowLongPtrA 在 64 位 Windows 上是真正的導出函數,但在 32 位 Windows 上,它只是一個解析為 GetWindowLongA 的宏。再舉一個例子,Interlocked 系列函數在 x86 版本的 Windows 上是導出函數,但在所有其他 Windows 體系結構上是內聯函數。pPS28資訊網——每日最新資訊28at.com

看起來還挺復雜的,那怎么能弄清楚這一切?方法是:研究頭文件。pPS28資訊網——每日最新資訊28at.com

在頭文件中,您將會看到函數是重定向宏、類似函數的宏、內聯函數、內部函數還是適當的導出函數。如果你無法從頭文件中弄清楚,你總是可以只編寫一個程序來調用你感興趣的函數,然后查看反匯編以查看實際生成的內容。pPS28資訊網——每日最新資訊28at.com

總結

當有不明白的地方的時候,最好的方法還是去翻閱源文件(頭文件)。
請堅信:任何事情(Bug)都是有原因的。
pPS28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-39484-0.html為什么不能通過GetProcAddress調用CreateWindow?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: CSS小知識,分享14個你可能還未用上但又實用的CSS屬性(上)

下一篇: EventLoop = TaskQueue + RenderQueue,你看明白了嗎?

標簽:
  • 熱門焦點
Top