自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么不能通過(guò)GetProcAddress調(diào)用CreateWindow?

開(kāi)發(fā) 前端
在頭文件中,您將會(huì)看到函數(shù)是重定向宏、類似函數(shù)的宏、內(nèi)聯(lián)函數(shù)、內(nèi)部函數(shù)還是適當(dāng)?shù)膶?dǎo)出函數(shù)。如果你無(wú)法從頭文件中弄清楚,你總是可以只編寫一個(gè)程序來(lái)調(diào)用你感興趣的函數(shù),然后查看反匯編以查看實(shí)際生成的內(nèi)容。

有時(shí)候,我看到有些人在折騰這樣一個(gè)問(wèn)題:
“我想使用 GetProcAddress 來(lái)獲取 CreateWindow 或者 ExitWindows 的調(diào)用地址,但是沒(méi)有成功。為什么?”

通常,他們當(dāng)時(shí)是在嘗試編寫平臺(tái)調(diào)用(P/Invoke)相關(guān)的代碼,因?yàn)閺牡讓拥慕嵌葋?lái)看,平臺(tái)調(diào)用是通過(guò) GetProcAddress 來(lái)實(shí)現(xiàn)的。

問(wèn)題來(lái)了:為什么 GetProcAddress 不能用在這些函數(shù)上呢?

原因是:它們(CreateWindow 或 ExitWindows)并非真正的導(dǎo)出函數(shù),如果你查看對(duì)應(yīng)的頭文件,則會(huì)看到這樣的宏定義。

事實(shí)上,CreateWindow 是一個(gè)雙重宏定義,首先它會(huì)根據(jù)當(dāng)前是否定義了 UNICODE 來(lái)展開(kāi)為 CreateWindowA 或者 CreateWindowW。然后,這些類似于函數(shù)的宏會(huì)再次被展開(kāi)為真正的導(dǎo)出函數(shù) CreateWindowExA 或者 CreateWindowExW。

如果包含 winuser.h 頭文件,則所有這些都由編譯器自動(dòng)處理,但如果出于某種原因,您希望為類似函數(shù)的宏(如 CreateWindow)使用 GetProcAddress,則必須手動(dòng)展開(kāi)宏以查看實(shí)際函數(shù)是什么,并將該函數(shù)名稱傳遞給 GetProcAddress。

上述原理也適用于內(nèi)聯(lián)函數(shù)。這些函數(shù)無(wú)法通過(guò) GetProcAddress 獲取,因?yàn)樗鼈兏静粫?huì)導(dǎo)出,它們?cè)陬^文件中作為源代碼提供給您調(diào)用。

請(qǐng)注意,某些內(nèi)容是真正的函數(shù)還是類似函數(shù)的宏(或內(nèi)聯(lián)函數(shù))可能取決于您的目標(biāo)平臺(tái)。例如,GetWindowLongPtrA 在 64 位 Windows 上是真正的導(dǎo)出函數(shù),但在 32 位 Windows 上,它只是一個(gè)解析為 GetWindowLongA 的宏。再舉一個(gè)例子,Interlocked 系列函數(shù)在 x86 版本的 Windows 上是導(dǎo)出函數(shù),但在所有其他 Windows 體系結(jié)構(gòu)上是內(nèi)聯(lián)函數(shù)。

看起來(lái)還挺復(fù)雜的,那怎么能弄清楚這一切?方法是:研究頭文件。

在頭文件中,您將會(huì)看到函數(shù)是重定向宏、類似函數(shù)的宏、內(nèi)聯(lián)函數(shù)、內(nèi)部函數(shù)還是適當(dāng)?shù)膶?dǎo)出函數(shù)。如果你無(wú)法從頭文件中弄清楚,你總是可以只編寫一個(gè)程序來(lái)調(diào)用你感興趣的函數(shù),然后查看反匯編以查看實(shí)際生成的內(nèi)容。

總結(jié)

當(dāng)有不明白的地方的時(shí)候,最好的方法還是去翻閱源文件(頭文件)。
請(qǐng)堅(jiān)信:任何事情(Bug)都是有原因的。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2021-07-30 06:49:40

SSD內(nèi)存CPU

2022-05-22 21:23:10

前端監(jiān)控系統(tǒng)

2012-12-18 11:55:38

2019-10-27 23:53:13

PC交換機(jī)通信

2022-02-15 07:03:04

start 源碼run線程

2023-09-14 13:23:42

Llama-2模型參數(shù)

2013-10-29 10:24:31

程序員漫畫

2023-10-30 08:51:09

平臺(tái)管理工程

2024-06-06 08:10:30

多線程Mapnull

2009-12-04 13:31:21

PHP全局變量不能生效

2018-06-04 15:17:10

編程語(yǔ)言中文編程

2021-07-09 06:00:45

網(wǎng)絡(luò)釣魚(yú)培訓(xùn)數(shù)據(jù)泄露

2011-05-05 17:57:18

軟件開(kāi)發(fā)

2017-02-07 20:49:15

2023-01-03 08:07:33

Go字符串指針

2017-12-13 12:33:14

UPS前端漏電

2015-07-17 11:11:20

虛擬化基礎(chǔ)架構(gòu)服務(wù)

2010-04-27 16:37:59

無(wú)線局域網(wǎng)

2021-07-19 09:27:42

SSD內(nèi)存Linux

2011-11-10 10:39:21

蘋果Siri
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)