控制代碼的本質

2021-05-25 18:03:58 字數 4156 閱讀 2083

控制代碼

是wondows用來標識被應用程式所建立或使用的物件的唯一整數,windows使用各種各樣的

控制代碼標識諸如應用程式例項,視窗,控制,位圖,gdi物件等等。windows

控制代碼有點象c語言中的檔案控制代碼。

從上面的定義中的我們可以看到,

控制代碼是乙個識別符號,是拿來標識物件或者專案的,它就象我們的姓名一樣,每個人都會有乙個,不同的人的姓名不一樣,但是,也可能有乙個名字和你一樣的人。從資料型別上來看它只是乙個16位的無符號整數。應用程式幾乎總是通過呼叫乙個windows函式來獲得乙個

控制代碼,之後其他的windows函式就可以使用該

控制代碼,以引用相應的物件。

如果想更透徹一點地認識

控制代碼,我可以告訴大家,

控制代碼是 一種指向指標的指標。我們知道,所謂指標是一種記憶體位址。應用程式啟動後,組成這個程式的各物件是住留在記憶體的。如果簡單地理解,似乎我們只要獲知這個內 存的首位址,那麼就可以隨時用這個位址訪問物件。但是,如果您真的這樣認為,那麼您就大錯特錯了。我們知道,windows是乙個以虛擬記憶體為基礎的操作 系統。在這種系統環境下,windows記憶體管理器經常在記憶體中來回移動物件,依此來滿足各種應用程式的記憶體需要。物件被移動意味著它的位址變化了。如果 位址總是如此變化,我們該到**去找該物件呢?

為了解決這個問題,windows作業系統為各應用程式騰出一些內儲存位址,用來專門登記各應用物件在記憶體中的位址變化,而這個位址(儲存單元的位置)本身是不變的。windows記憶體管理器在移動物件在記憶體中的位置後,把物件新的位址告知這個

控制代碼位址來儲存。這樣我們只需記住這個

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

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

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

控制代碼,並將

控制代碼返回給應用程式,然後通過

控制代碼來進行操作。

但是必須注意的是程式每次從新啟動,系統不能保證分配給這個程式的

控制代碼還是原來的那個

控制代碼,而且絕大多數情況的確不一樣的。假如我們把進入電影院看電影看成是乙個應用程式的啟動執行,那麼系統給應用程式分配的

控制代碼總是不一樣,這和每次電影院售給我們的門票總是不同的乙個座位是一樣的道理。

受m$的幫助文件以及很多windows程式設計書籍的影響,大家對局柄比較普遍的認識是:

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

控制代碼不是乙個指標……

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

請先到windef.h找絕大多數

控制代碼的定義:

declare_handle(hwnd);

declare_handle(hhook);

……declare_handle(hgdiobj);

declare_handle(hbitmap);

declare_handle(hbrush);

……typedef handle          hglobal;

typedef handle          hlocal;

……

ok, 現在大家跟我一起翻到winnt.h,看看declare_handle和handle到底是什麼:

#ifdef strict

typedef void *handle;

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

#else

typedef pvoid handle;

#define declare_handle(name) typedef handle name

#endif

typedef handle *phandle;

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

而declare_handle(hwnd);就是:

struct hwnd__ ;

typedef struct hwnd__ *hwnd;

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

現在解釋下m$這麼做的意義,這就是所謂資料封裝,你可以在你的程式中把m$的內部結構指標傳來傳去,可是你卻不知道它到底指向的內容是什麼,而且可以編個控制代碼

#include //這個和大家用的一樣

#include "windows_in.h" //這個是m$自用的,外人別想看到^o^

hsomethingelse dosomething(hsomething hsomething) ; typedef struct name##__ *name

#else

typedef pvoid handle;

#define declare_handle(name) typedef handle name

#endif

declare_handle(hmodule);

declare_handle(hinstance);

declare_handle(hlocal);

declare_handle(hglobal);

declare_handle(hdc);

declare_handle(hrgn);

declare_handle(hwnd);

declare_handle(hmenu);

declare_handle(haccel);

declare_handle(htask);

三、理解:

handle就是pvoid,也就是無型別指標,

上面這些資源的控制代碼handles都不過是指向struct的指標,至於這個struct的用處,連m$都說unused了,現在解釋下m$這麼做的意義,這就是所謂資料封裝,你可以在你的程式中把m$的內部結構指標傳來傳去,可是你卻不知道它到底指向的內容是什麼。

控制代碼與指標確實是完全不同的兩個概念。控制代碼僅僅是乙個32位整數,win32中用於標記某個系統或程序的物件,可以理解為物件索引(由於m$未完全公開相關技術,在一定程度上只能如此理解),這個索引更像是一種對映關係(從控制代碼到物件指標的對映),而不是純粹意義上的「陣列下標」。

控制代碼可以理解為用於指向或標識記憶體的一塊「資源」,這些資源如:檔案(file)、記憶體塊(block of memory)、選單(menu)等等。作業系統通過控制代碼來定位核心物件和系統資源。

指標即為指向記憶體的「資料或指令」某一單元。

說的確切一點,控制代碼實際上是一種指向某種資源的指標,但與指標又有所不同:指標對應著乙個資料在記憶體中的位址,得到了指標就可以自由地修改該資料。windows並不希望一般程式修改其內部資料結構,因為這樣太不安全。所以windows給每個使用globalalloc等函式宣告的記憶體區域指定乙個控制代碼(本質上仍是乙個指標,但不要直接操作它),平時你只是在呼叫api函式時利用這個控制代碼來說明要操作哪段記憶體。

四、引喻:

牧童遙指杏花村

牧童的手為指標,杏花村的牌子為控制代碼,杏花村酒店為物件的例項.

附註:獲得視窗控制代碼三種方法

1.hwnd findwindow(lpctstr lpclassname, lpctstr lpwindowname)

hwnd findwindowex(hwnd hwndparent, hwnd hwndchildafter,lpctstr lpclassname, lpctstr lpwindowname)

2.hwnd windowfrompoint(point& point)//獲得當前滑鼠游標位置的視窗hwnd

3.bool callback enumchildproc(hwnd hwnd,lparam lparam)

bool callback enumchildwindows(hwnd hwndparent, wndenumproc lpenumfunc,lparam lparam)

bool callback enumwindows(wndenumproc lpenumfunc, lparam lparam)

bool callback enumwindowsproc(hwnd hwnd, lparam lparam)

控制代碼的本質

handle就是pvoid,也就是無型別指標,上面這些資源的控制代碼handles都不過是指向struct的指標,至於這個struct的用處,連m 都說unused了,現在解釋下m 這麼做的意義,這就是所謂資料封裝,你可以在你的程式中把m 的內部結構指標傳來傳去,可是你卻不知道它到底指向的內容是什麼...

控制代碼的本質

一 書上定義 microsoft press,by richard wilton 在windows環境中,控制代碼是用來標識專案的,這些專案包括 模組 module 任務 task 例項 instance 檔案 file 記憶體塊 block of memory 選單 menu 控制 control...

模組控制代碼(例項控制代碼)和控制代碼的區別

解釋一 1 模組的概念 乙個模組代表的是乙個執行中的exe檔案或dll檔案,用來代表這個檔案中所有的 和資源,磁碟上的檔案不是模組,裝入記憶體後執行時就叫做模組。乙個應用程式呼叫其他dll中的api時,這些dll檔案被裝入記憶體,就產生了不同的模組,為了區分位址空間中的不同模組,每個模組都有乙個惟一...