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

日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

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

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

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

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

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

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

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

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

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

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

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

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

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

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

總結

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

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

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

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

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

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 五华县| 通海县| 安康市| 福建省| 庆元县| 远安县| 富顺县| 云梦县| 延边| 平陆县| 自治县| 即墨市| 玛多县| 临桂县| 夹江县| 隆昌县| 康平县| 新绛县| 眉山市| 富裕县| 屏东县| 永嘉县| 宁强县| 玉环县| 万载县| 涿鹿县| 黑山县| 集贤县| 琼结县| 宜川县| 金川县| 那曲县| 沙洋县| 霍州市| 敦化市| 德兴市| 巴塘县| 吉木萨尔县| 南昌市| 石泉县| 六盘水市|