什麼是控制代碼(HANDLE)

2022-05-03 01:36:12 字數 2394 閱讀 1453

handle:  

控制代碼是wondows用來標識被應用程式所建立或使用的物件的唯一整數,windows使用各種各樣的控制代碼標識諸如應用程式例項,視窗,

控制,位圖,gdi物件等等。從資料型別上來看它是乙個16位的無符號整數(0 ~ 65535)。

如果想更透徹一點地認識控制代碼,我可以告訴大家,控制代碼是一種指向指標的指標。我們知道,

所謂指標是一種記憶體位址。應用程式啟動後,組

成這個程式的各物件是住留在記憶體的。如

果簡單地理解,似乎我們只要獲知這個記憶體的首位址,那麼就可以隨時用這個位址訪

問物件。

但是,如果您真的這樣認為,那麼您就大錯特錯了。我們知道,windows是一

個以虛擬記憶體為基礎的操作 系統。在這種系統環境下,win-

dows記憶體管理器經常在記憶體

中來回移動物件,依此來滿足各種應用程式的記憶體需要。物件被移動意味著它的位址變化

了。如果 位址總是如

此變化,我們該到**去找該物件呢?

為了解決這個問題,windows作業系統為各應用程式騰出一些內儲存位址,用來專門登記各應用物件在記憶體中的位址變化,而這個位址(存

儲單元的位置)本身是不變的。windows記憶體管理器在移動物件在記憶體中的位置後,把物件新的位址告知這個控制代碼位址來儲存。這樣我們只

需記住這個控制代碼位址就可以間接地知道物件具體在記憶體中的哪個位置。這個位址是在物件裝載(load)時由系統分配給的,當系統解除安裝時(un

load)又釋放給系統。

控制代碼位址(穩定)→記載著物件在記憶體中的位址────→物件在記憶體中的位址(不穩定)→實際物件

windows程式中並不是用實體地址來標識乙個記憶體塊,檔案,任務或動態裝入模組的,相反的,windows api給這些專案分配確定的

控制代碼,並將控制代碼返回給應用程式,然後通過控制代碼來進行操作。但是必須注意的是程式每次從新啟動,系統不能保證分配給這個程式的控制代碼還

是原來的那個控制代碼,而且絕大多數情況的確不一樣的。

控制代碼是乙個整數,用以標識windows物件,控制代碼不

是乙個指標……而實際上,這些不過是m$進行資料封裝的幌子而已,下面我們一起來分析一下handle到底是什麼。

請先到windef.h找絕大多數

控制代碼的定義(~\microsoft sdks\windows\v7.0a\include):

1

declare_handle(hwnd);23

declare_handle(hhook);45

……67declare_handle(hgdiobj);89

declare_handle(hbitmap);

1011

declare_handle(hbrush);

1213

……14

15typedef handle hglobal;

1617 typedef handle hlocal;

1

#ifdef strict

2 typedef void *handle;

3#if 0 && (_msc_ver > 1000)

4#define declare_handle(name) struct name##__; typedef struct name##__ *name

5#else

6#define declare_handle(name) struct name##__; typedef struct name##__ *name

7#endif

8#else

9typedef pvoid handle;

10#define declare_handle(name) typedef handle name

11#endif

12 typedef handle *phandle;

哈哈,現在知道了吧,handle就是pvoid,也就是無型別指標,

而declare_handle(hwnd);就是:

struct hwnd__ ;

typedef struct hwnd__ *hwnd;

現在實際上都清楚啦,這些handles都不過是指向struct的指標,至於這個struct的用處,連m$都說unused了,^o^

現在解釋下m$這麼做的意義,這就是所謂資料封裝,你可以在你的程式中把m$的內部結構指標傳來傳去,可是你卻不知

道它到底指向的內容是什麼

)。而m$的程式大可以這麼寫:

1 #include //

這個和大家用的一樣

2 #include "

windows_in.h"//

這個是m$自用的,外人別想看到^o^

3hsomethingelse dosomething(hsomething hsomething)

4

什麼是控制代碼?為什麼會有控制代碼?HANDLE

關鍵字 控制代碼,handle,windows sdk,windows.h,從廣義上,能夠從乙個數值拎起一大堆資料的東西都可以叫做控制代碼。控制代碼的英文是 handle 本義就是 柄 只是在電腦科學中,被特別地翻譯成 控制代碼 其實還是個 柄 從乙個小東西拎起一大堆東西,這難道不像是個 柄 嗎?然...

什麼是控制代碼?為什麼會有控制代碼?HANDLE

從廣義上,能夠從乙個數值拎起一大堆資料的東西都可以叫做控制代碼。控制代碼的英文是 handle 本義就是 柄 只是在電腦科學中,被特別地翻譯成 控制代碼 其實還是個 柄 從乙個小東西拎起一大堆東西,這難道不像是個 柄 嗎?然後,指標其實也是一種 控制代碼 只是由於指標同時擁有更特殊的含義 實實在在地...

什麼是控制代碼?為什麼會有控制代碼?HANDLE

從廣義上,能夠從乙個數值拎起一大堆資料的東西都可以叫做控制代碼。控制代碼的英文是 handle 本義就是 柄 只是在電腦科學中,被特別地翻譯成 控制代碼 其實還是個 柄 從乙個小東西拎起一大堆東西,這難道不像是個 柄 嗎?然後,指標其實也是一種 控制代碼 只是由於指標同時擁有更特殊的含義 實實在在地...