複製鏈接
請複製以下鏈接發送給好友

句柄

鎖定
句柄(Handle)是一個用來標識對象或者項目的標識符,可以用來描述窗體、文件等,值得注意的是句柄不能是常量 [1] 
Windows之所以要設立句柄,根本上源於內存管理機制的問題,即虛擬地址。簡而言之數據的地址需要變動,變動以後就需要有人來記錄、管理變動,因此係統用句柄來記載數據地址的變更。在程序設計中,句柄是一種特殊的智能指針,當一個應用程序要引用其他系統(如數據庫、操作系統)所管理的內存塊或對象時,就要使用句柄 [1] 
中文名
句柄 [1] 
外文名
Handle [1] 
定    義
標識對象或者項目的標識符 [1] 
領    域
數理科學 [1] 
由    來
源於內存管理機制—虛擬地址 [1] 
本    質
一種標識符 [2] 

句柄簡介

句柄(handle)是C++程序設計中經常提及的一個術語。它並不是一種具體的、固定不變的數據類型或實體,而是代表了程序設計中的一個廣義的概念。句柄一般是指獲取另一個對象的方法——一個廣義的指針,它的具體形式可能是一個整數、一個對象或就是一個真實的指針,而它的目的就是建立起與被訪問對象之間的唯一的聯繫 [3] 
在C++中,要訪問一個對象,通常可以建立一個指向對象的指針。但是在很多具體的應用中,直接用指針代表對象並不是一個好的解決方案 [3] 

句柄對象

句柄是Windows系統中對象或實例的標識,這些對象包括模塊、應用程序實例、窗口、控件、位圖、GDI對象、資源、文件等 [4] 

句柄數據類型

數據類型上來看,它只是一個16位的無符號整數。應用程序總是通過調用Windows API獲得一個句柄,之後其他 Windows函數就可以使用該句柄,以引用和操作相應的內核對象。句柄可以像指針那樣置空,那樣句柄就沒有任何意義,不代表任何內核對象 [5] 

句柄使用

句柄在 Windows編程中是一個很重要的概念,在 Windows程序中並不是用物理地址來標識一個內存塊、文件、任務或動態裝入模塊的。相反地,Windows API給這些項目分配確定的句柄,並將句柄返回給應用程序,然後通過句柄來進行操作 [2] 
應該明白的是,句柄是一個標識符,是用來標識對象或者項目的。從數據類型上來看它只是一個16位的無符號整數。應用程序幾乎總是通過調用一個Windows函數來獲得一個句柄,之後其他的Windows函數就可以使用該句柄,以引用相應的對象。在 Windows編程中會用到大量的句柄 [2] 

句柄好處

句柄可以給我們帶來如下的好處: [6] 
1、我們可以在實現中用尺寸大小固定的(constant-sized)對象來表示尺寸大小不定的(variable-sized)值 [6] 
2、我們可以在實現中用運行時綁定(run-time bounding)而不是編譯時(compile-timebounding)綁定的方式來處理對象 [6] 
3、對於實現的改變通常只會引起一次重新鏈接,而不是重新編譯 [6] 
4、我們可以對他人隱藏對象的實現 [6] 

句柄發展

在早期的Windows應用程序中,句柄的使用是很頻繁的。但隨着MFC類庫發展,其對Windows內核的封裝程度不斷提高。這樣如果用MFC類庫編程的話,就很少會有機會直接對句柄進行操作。但是如果使用 Windows API函數的話,依然需要對句柄進行直接操作 [7] 
參考資料
  • 1.    劉國華,HALCON數字圖像處理,西安電子科技大學出版社,2018.06,第106頁
  • 2.    本書編委會編著,Visual C++程序設計,中國計劃出版社,2007.08,第59頁
  • 3.    陳剛編著,C++高級進階教程,武漢大學出版社,2008.10,第205頁
  • 4.    黃永忠編著,面向對象方法與技術基礎,國防工業出版社,2006.05,第122頁
  • 5.    石磊玉編著,日臻完善 軟件調試與優化典型應用,中國鐵道出版社,2010.01,第250頁
  • 6.    (美)Robert B.Murray著;王昕譯,C++編程慣用法-高級程序員常用方法和技巧,中國電力出版社,2004.02,第48頁
  • 7.    張志學等編著,Visual C++項目開發指南 定製自己的Photoshop,清華大學出版社,2000.10,第32頁