控制程式碼的本質(整理-收藏)

mantian發表於2005-08-29
覺得有點用處,拿來收藏一下。[@more@]
轉自:http://blog.csdn.net/feijj2002_/services/trackbacks/466683.aspx

一、書上定義:

<>(Microsoft Press,by Richard Wilton)
在Windows環境中,控制程式碼是用來標識專案的,這些專案包括:模組(module)、任務(task)、例項
(instance)、檔案(file)、記憶體塊(block of memory)、選單(menu)、控制(control)、字型(font)、資源(resource),包括圖示(icon),游標 (cursor),字串(string)等、GDI物件(GDI object),包括位圖(bitmap),畫刷(brush),元檔案(metafile),調色盤(palette),畫筆(pen),區域 (region),以及裝置描述表(device context)。

<>(南京大學出版社):
控制程式碼是WONDOWS用來標識被應用程式所建立或使用的物件的唯一整數,WINDOWS使用各種各樣的控制程式碼
標識諸如應用程式例項,視窗,控制,點陣圖,GDI物件等等。WINDOWS控制程式碼有點象C語言中的檔案控制程式碼。

二、MS原始碼:

#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; 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函式時利用這個控制程式碼來說明要操作哪段記憶體。

控制程式碼是Windows程式設計的一個關鍵性的概念,編寫Windows應用程式總是要和各種控制程式碼打交道。所謂控制程式碼,就是一個唯一的數,用以標識許多不同的物件型別,如視窗、選單、記憶體、畫筆、畫刷等。在Win32裡,控制程式碼是指向一個“無型別物件”(void*)的指標,也就是一個4位元組長的資料。無論它的本質是什麼,控制程式碼並不是一個真正意義上的指標。從構造上看,控制程式碼是一個指標,儘管它沒有指向用於儲存某個物件的記憶體位置。事實上,控制程式碼指向一個包含了對該物件進行的引用的位置。控制程式碼的宣告是這樣的:

typedef void *HANDLE

由於Windows是一個多工作業系統,它可以同時執行多個程式或一個程式的多個副本。這些執行的程式稱為一個例項。為了對同一程式的多個副本進行管理,Windows引入了例項控制程式碼。Windows為每個應用程式建立一張表,例項控制程式碼就好象是這張表的一個索引。

Windows不僅使用控制程式碼來管理例項,也用它來管理視窗、點陣圖、字型、元檔案、圖示等系統資源


四、引喻:

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

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

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)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/559014/viewspace-805342/,如需轉載,請註明出處,否則將追究法律責任。

相關文章