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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

總結

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

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

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

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

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

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 涿州市| 德清县| 兰坪| 古交市| 沿河| 新津县| 林西县| 定日县| 察雅县| 周至县| 徐汇区| 阜南县| 麦盖提县| 习水县| 卢湾区| 从江县| 姜堰市| 南丰县| 宁陵县| 芜湖市| 舟曲县| 湖口县| 彭泽县| 方正县| 沙田区| 津市市| 崇阳县| 西乡县| 库伦旗| 常熟市| 新巴尔虎左旗| 竹山县| 灵武市| 余姚市| 通化县| 孝昌县| 双流县| 防城港市| 宣化县| 涟水县| 贵阳市|