什么是句柄?
什么是句柄
先來看些權(quán)威的片斷:
...
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
...
知道本質(zhì)了吧~~~~
WINDOWS程序中并不是用物理地址來標(biāo)識一個內(nèi)存塊,文件,任務(wù)或動態(tài)裝入模塊的,相反的,WINDOWS API給這些項目分配確定的句柄,并將句柄返回給應(yīng)用程序,然后通過句柄來進(jìn)行操作。
在<<WINDOWS編程短平快>>(南京大學(xué)出版社)一書中是這么說的:句柄是WONDOWS用來標(biāo)識被應(yīng)用程序所建立或使用的對象的唯一整數(shù),WINDOWS使用各種各樣的句柄標(biāo)識諸如應(yīng)用程序?qū)嵗?#xff0c;窗口,控制,位圖,GDI對象等等。WINDOWS句柄有點(diǎn)象C語言中的文件句柄。
從上面的2個定義中的我們可以看到,句柄是一個標(biāo)識符,是拿來標(biāo)識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從數(shù)據(jù)類型上來看它只是一個16位的無符號整數(shù)。應(yīng)用程序幾乎總是通過調(diào)用一個WINDOWS函數(shù)來獲得一個句柄,之后其他的WINDOWS函數(shù)就可以使用該句柄,以引用相應(yīng)的對象。在WINDOWS編程中會用到大量的句柄,比如:HINSTANCE(實(shí)例句柄),HBITMAP(位圖句柄),HDC(設(shè)備描述表句柄),HICON(圖標(biāo)句柄)等等,這當(dāng)中還有一個通用的句柄,就是HANDLE,比如下面的語句:
HINSTANCE hInstance;
可以改成:
HANDLE hInstance;
上面的2句語句都是對的。
一個WINDOWS應(yīng)用程序可以用不同的方法獲得一個特定項的句柄。許多API函數(shù),諸如CreateWindow,GlobalAlloc,OpenFile的返回值都是一個句柄值。另外,WINDOWS也能通過應(yīng)用程序的引出函數(shù)將一個句柄作為參數(shù)傳送給應(yīng)用程序,應(yīng)用程序一旦獲得了一個確定項的句柄,便可在WINDOWS環(huán)境下的任何地方對這個句柄進(jìn)行操作。其實(shí)句柄的大量使用已經(jīng)影響到了每一個WINDOWS的程序設(shè)計。
句柄只有當(dāng)唯一的確定了一個項目的時候,它才開始有意義。句柄對應(yīng)著項目表中的一項,而只有WINDOWS本身才能直接存取這個表,應(yīng)用程序只能通過API函數(shù)來處理不同的句柄,舉個例子來說吧!比如:我們可以為我們的應(yīng)用程序申請一塊內(nèi)存塊,通過調(diào)用API函數(shù)GlobalAlloc,來返回一個句柄值:
hMem=GlobalAlloc(......);
其實(shí)現(xiàn)在hMem的值只是一個索引值,不是物理地址,應(yīng)用程序還不能直接存取這塊內(nèi)存。這兒還有一個話外題,就是,一般情況下我們在編程的時候,給應(yīng)用程序分配的內(nèi)存都是可以移動的或者是可以丟棄的,這樣能使有限的內(nèi)存資源充分利用,所以,在某一個時候我們分配的那塊內(nèi)存的地址是不確定的,因為他是可以移動的,所以得先鎖定那塊內(nèi)存塊,這兒應(yīng)用程序需要調(diào)用API函數(shù)GlobalLock函數(shù)來鎖定句柄。如下:
lpMem=GlobalLock(hMem);
這樣應(yīng)用程序才能存取這塊內(nèi)存。
先來看些權(quán)威的片斷:
...
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
...
知道本質(zhì)了吧~~~~
WINDOWS程序中并不是用物理地址來標(biāo)識一個內(nèi)存塊,文件,任務(wù)或動態(tài)裝入模塊的,相反的,WINDOWS API給這些項目分配確定的句柄,并將句柄返回給應(yīng)用程序,然后通過句柄來進(jìn)行操作。
在<<WINDOWS編程短平快>>(南京大學(xué)出版社)一書中是這么說的:句柄是WONDOWS用來標(biāo)識被應(yīng)用程序所建立或使用的對象的唯一整數(shù),WINDOWS使用各種各樣的句柄標(biāo)識諸如應(yīng)用程序?qū)嵗?#xff0c;窗口,控制,位圖,GDI對象等等。WINDOWS句柄有點(diǎn)象C語言中的文件句柄。
從上面的2個定義中的我們可以看到,句柄是一個標(biāo)識符,是拿來標(biāo)識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從數(shù)據(jù)類型上來看它只是一個16位的無符號整數(shù)。應(yīng)用程序幾乎總是通過調(diào)用一個WINDOWS函數(shù)來獲得一個句柄,之后其他的WINDOWS函數(shù)就可以使用該句柄,以引用相應(yīng)的對象。在WINDOWS編程中會用到大量的句柄,比如:HINSTANCE(實(shí)例句柄),HBITMAP(位圖句柄),HDC(設(shè)備描述表句柄),HICON(圖標(biāo)句柄)等等,這當(dāng)中還有一個通用的句柄,就是HANDLE,比如下面的語句:
HINSTANCE hInstance;
可以改成:
HANDLE hInstance;
上面的2句語句都是對的。
一個WINDOWS應(yīng)用程序可以用不同的方法獲得一個特定項的句柄。許多API函數(shù),諸如CreateWindow,GlobalAlloc,OpenFile的返回值都是一個句柄值。另外,WINDOWS也能通過應(yīng)用程序的引出函數(shù)將一個句柄作為參數(shù)傳送給應(yīng)用程序,應(yīng)用程序一旦獲得了一個確定項的句柄,便可在WINDOWS環(huán)境下的任何地方對這個句柄進(jìn)行操作。其實(shí)句柄的大量使用已經(jīng)影響到了每一個WINDOWS的程序設(shè)計。
句柄只有當(dāng)唯一的確定了一個項目的時候,它才開始有意義。句柄對應(yīng)著項目表中的一項,而只有WINDOWS本身才能直接存取這個表,應(yīng)用程序只能通過API函數(shù)來處理不同的句柄,舉個例子來說吧!比如:我們可以為我們的應(yīng)用程序申請一塊內(nèi)存塊,通過調(diào)用API函數(shù)GlobalAlloc,來返回一個句柄值:
hMem=GlobalAlloc(......);
其實(shí)現(xiàn)在hMem的值只是一個索引值,不是物理地址,應(yīng)用程序還不能直接存取這塊內(nèi)存。這兒還有一個話外題,就是,一般情況下我們在編程的時候,給應(yīng)用程序分配的內(nèi)存都是可以移動的或者是可以丟棄的,這樣能使有限的內(nèi)存資源充分利用,所以,在某一個時候我們分配的那塊內(nèi)存的地址是不確定的,因為他是可以移動的,所以得先鎖定那塊內(nèi)存塊,這兒應(yīng)用程序需要調(diào)用API函數(shù)GlobalLock函數(shù)來鎖定句柄。如下:
lpMem=GlobalLock(hMem);
這樣應(yīng)用程序才能存取這塊內(nèi)存。
總結(jié)
- 上一篇: 听说玩这些游戏能提升编程能力?
- 下一篇: 吴恩达《卷积神经网络》精炼笔记(2)--