“我想使用 GetProcAddress 來獲取 CreateWindow 或者 ExitWindows 的調用地址,但是沒有成功。為什么?”通常,他們當時是在嘗試編寫平臺調用(P/Invoke)相關的代碼,因為從底層的角" />
有時候,我看到有些人在折騰這樣一個問題:
“我想使用 GetProcAddress 來獲取 CreateWindow 或者 ExitWindows 的調用地址,但是沒有成功。為什么?”
通常,他們當時是在嘗試編寫平臺調用(P/Invoke)相關的代碼,因為從底層的角度來看,平臺調用是通過 GetProcAddress 來實現的。
問題來了:為什么 GetProcAddress 不能用在這些函數上呢?
原因是:它們(CreateWindow 或 ExitWindows)并非真正的導出函數,如果你查看對應的頭文件,則會看到這樣的宏定義。
事實上,CreateWindow 是一個雙重宏定義,首先它會根據當前是否定義了 UNICODE 來展開為 CreateWindowA 或者 CreateWindowW。然后,這些類似于函數的宏會再次被展開為真正的導出函數 CreateWindowExA 或者 CreateWindowExW。
如果包含 winuser.h 頭文件,則所有這些都由編譯器自動處理,但如果出于某種原因,您希望為類似函數的宏(如 CreateWindow)使用 GetProcAddress,則必須手動展開宏以查看實際函數是什么,并將該函數名稱傳遞給 GetProcAddress。
上述原理也適用于內聯函數。這些函數無法通過 GetProcAddress 獲取,因為它們根本不會導出,它們在頭文件中作為源代碼提供給您調用。
請注意,某些內容是真正的函數還是類似函數的宏(或內聯函數)可能取決于您的目標平臺。例如,GetWindowLongPtrA 在 64 位 Windows 上是真正的導出函數,但在 32 位 Windows 上,它只是一個解析為 GetWindowLongA 的宏。再舉一個例子,Interlocked 系列函數在 x86 版本的 Windows 上是導出函數,但在所有其他 Windows 體系結構上是內聯函數。
看起來還挺復雜的,那怎么能弄清楚這一切?方法是:研究頭文件。
在頭文件中,您將會看到函數是重定向宏、類似函數的宏、內聯函數、內部函數還是適當的導出函數。如果你無法從頭文件中弄清楚,你總是可以只編寫一個程序來調用你感興趣的函數,然后查看反匯編以查看實際生成的內容。
當有不明白的地方的時候,最好的方法還是去翻閱源文件(頭文件)。
請堅信:任何事情(Bug)都是有原因的。
本文鏈接:http://www.www897cc.com/showinfo-26-39484-0.html為什么不能通過GetProcAddress調用CreateWindow?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com