當前位置:編程學習大全網 - 源碼下載 - 句柄是什麽意思? 它是c#的嗎,csdn怎麽查關於句柄

句柄是什麽意思? 它是c#的嗎,csdn怎麽查關於句柄

句柄概念在WINDOWS編程中是壹個很重要的概念,在許多地方都扮演著重要的角色。但由此而產生的句柄概念也大同小異,比如:<<Microsoft Windows 3 Developer's Workshop>>(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)。

WINDOWS程序中並不是用物理地址來標識壹個內存塊,文件,任務或動態裝入模塊的,相反的,WINDOWS API給這些項目分配確定的句柄,並將句柄返回給應用程序,然後通過句柄來進行操作。

在<<WINDOWS編程短平快>>(南京大學出版社)壹書中是這麽說的:句柄是WINDOWS用來標識被應用程序所建立或使用的對象的唯壹整數,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);

這樣應用程序才能存取這塊內存。

註意:

內核對象句柄,是用來標識某個內核對象的壹個id

同壹個對象的該id對於每個進程是不同的,具體如何實現是ms不公開的算法,以下是壹個近似的,可能的算法:

進程創建時,windows系統為進程構造了壹個句柄表

當該進程希望獲得壹個內核對象句柄或者創建壹個內核對象從而獲得該對象句柄時

系統會將在句柄表中增加壹個表項,表項的內容中存儲了指向目標內核對象的指針

同時,系統返回這個表項在句柄表中的索引作為句柄

這樣,進程就通過句柄查詢句柄表得到對象指針,從而可以訪問該對象。

同時又由於有了句柄表的保護,可以防止對內核對象的非法操作。

我想現在大家已經能對句柄概念有所了解了,我希望我的文章能對大家有所幫助。其實如果妳學過SDK編程,那對句柄的概念理解會更好,更深。如果妳是直接學VC6的MFC編程的,建議妳看壹下SDK編程,這會對妳大有好處。

  • 上一篇:汽車源代碼管理系統
  • 下一篇:排序源代碼
  • copyright 2024編程學習大全網