什麼是控制代碼
先來看些權威的片斷:
...
typedef unsigned int HANDLE;
#define DECLARE_HANDLE(name) typedef UINT name
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);
...
#define DECLARE_HANDLE(x) typedef WORD x
...
//+-------------------------------------------------------------------------
// DECLARE_HANDLE Macro
//--------------------------------------------------------------------------
#ifndef DECLARE_HANDLE
#define DECLARE_HANDLE(name) /
struct name##__ { DWORD unused; }; /
typedef struct name##__ _far* name
#endif
...
知道本質了吧~~~~
WINDOWS程式中並不是用物理地址來標識一個記憶體塊,檔案,任務或動態裝入模組的,相反的,WINDOWS API給這些項目分配確定的控制代碼,並將控制代碼返回給應用程式,然後通過控制代碼來進行操作。
在<<WINDOWS編程短平快>>(南京大學出版社)一書中是這麼說的:控制代碼是WONDOWS用來標識被應用程式所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的控制代碼標識諸如應用程式執行個體,視窗,控制,位元影像,GDI對象等等。WINDOWS控制代碼有點象C語言中的檔案控制代碼。
從上面的2個定義中的我們可以看到,控制代碼是一個標識符,是拿來標識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從資料類型上來看它只是一個16位的不帶正負號的整數。應用程式幾乎總是通過調用一個WINDOWS函數來獲得一個控制代碼,之後其他的WINDOWS函數就可以使用該控制代碼,以引用相應的對象。在WINDOWS編程中會用到大量的控制代碼,比如:HINSTANCE(執行個體控制代碼),HBITMAP(位元影像控制代碼),HDC(裝置描述表控制代碼),HICON(表徵圖控制代碼)等等,這當中還有一個通用的控制代碼,就是HANDLE,比如下面的語句:
HINSTANCE hInstance;
可以改成:
HANDLE hInstance;
上面的2句語句都是對的。
一個WINDOWS應用程式可以用不同的方法獲得一個特定項的控制代碼。許多API函數,諸如CreateWindow,GlobalAlloc,OpenFile的傳回值都是一個控制代碼值。另外,WINDOWS也能通過應用程式的引出函數將一個控制代碼作為參數傳送給應用程式,應用程式一旦獲得了一個確定項的控制代碼,便可在WINDOWS環境下的任何地方對這個控制代碼進行操作。其實控制代碼的大量使用已經影響到了每一個WINDOWS的程式設計。
控制代碼只有當唯一的確定了一個項目的時候,它才開始有意義。控制代碼對應著項目表中的一項,而只有WINDOWS本身才能直接存取這個表,應用程式只能通過API函數來處理不同的控制代碼,舉個例子來說吧!比如:我們可以為我們的應用程式申請一塊記憶體塊,通過調用API函數GlobalAlloc,來返回一個控制代碼值:
hMem=GlobalAlloc(......);
其實現在hMem的值只是一個索引值,不是物理地址,應用程式還不能直接存取這塊記憶體。這兒還有一個話外題,就是,一般情況下我們在編程的時候,給應用程式分配的記憶體都是可以移動的或者是可以丟棄的,這樣能使有限的記憶體資源充分利用,所以,在某一個時候我們分配的那塊記憶體的地址是不確定的,因為他是可以移動的,所以得先鎖定那塊記憶體塊,這兒應用程式需要調用API函數GlobalLock函數來鎖定控制代碼。如下:
lpMem=GlobalLock(hMem);
這樣應用程式才能存取這塊記憶體。