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

handle

(Windows操作系統中的一個概念)

鎖定
HANDLE:句柄,是Windows用來表示對象的(不是C++的對象),HWND是其中一種,HWND是HANDLE,但HANDLE不只是HWND,HANDLE是一個通用句柄表示,HWND是一個專用表示窗口的句柄。更具體的可查找MSDN。包含在winnt.h頭文件中。
中文名
handle
意    義
句柄
應    用
用來表示對象
適    用
Windows操作系統

目錄

handle介紹

在windows程序中,有各種各樣的資源(窗口、圖標、光標等),系統在創建這些資源時會為他們分配內存,並返回標示這些資源的標示號,即句柄 [1] 
句柄指的是一個核心對象在某一個進程中的唯一索引,而不是指針
由於地址空間的限制,句柄所標識的內容對進程是不可見的,只能由操作系統通過進程句柄列表來進行維護。句柄列表:每個進程都要創建一個句柄列表,這些句柄指向各種系統資源,比如信號量線程,和文件等,進程中的所有線程都可以訪問這些資源 [2] 
其實我們編程時輸出一下句柄的值就可以發現這些值往往非常小(<100)。由此就可以看出句柄的性質了。
無效的返回值為: INVALID_HANDLE_VALUE
編程時可作調試用:
HANDLE:句柄,是windows用來表示對象的(不是C++的對象),HWND是其中一種。
HANDLE是一個通用句柄表示,HWND是一個專用表示窗口的句柄。
CreateThread
Windows API函數,該函數在主線程的基礎上創建一個新線程。
WaitForMultipleObjects
WaitForMultipleObjects:幾乎可以等待Windows中的所有的內核對象。
原型:
DWORD WaitForMultipleObjects(DWORD nCount,const HANDLE* lpHandles,BOOL bWaitAll,DWORD dwMilliseconds);
WaitForSingleObject的返回值能夠指明調用線程為什麼再次變為可調度狀態。如果線程等待的對象變為已通知狀態,那麼返回值是 WAIT_OBJECT_0。如果設置的超時已經到期,則返回值是WAIT_TIMEOUT。如果將一個錯誤的值(如一個無效句柄)傳遞給 WaitForSingleObject,那麼返回值將是WAIT_FAILED(若要了解詳細信息,可調用GetLastError)
nCount參數用於指明想要讓函數查看的內核對象的數量。這個值必須在1與MAXIMUM_WAIT_OBJECTS(在Windows頭文件中定義為64)之間。lpHandles參數是指向內核對象句柄的數組的指針。
可以以兩種不同的方式來使用WaitForMultipleObjects函數:
一種方式是讓線程進入等待狀態,直到指定內核對象中的任何一個變為已通知狀態。
另一種方式是讓線程進入等待狀態,直到所有指定的內核對象都變為已通知狀態。bWaitAll參數告訴該函數,你想要讓它使用何種方式。如果為該參數傳遞TRUE,那麼在所有對象變為已通知狀態之前,該函數將不允許調用線程運行。
WaitForMultipleObjects函數的返回值告訴調用線程,為 什麼它會被重新調度。可能的返回值是WAIT_FAILED和WAIT_TIMEOUT,這兩個值的作用是很清楚的。如果fWaitAll參數傳遞 TRUE,同時所有對象均變為已通知狀態,那麼返回值是WAIT_OBJECT_0。
如果為fWaitAll傳遞FALSE,那麼一旦任何一個對象變為已 通知狀態,該函數便返回。在這種情況下,你可能想要知道哪個對象變為已通知狀態。返回值是WAIT_OBJECT_0 與(WAIT_OBJECT_0 +dwCount-1)之間的一個值。換句話説,如果返回值不是WAIT_TIMEOUT,也不是WAIT_FAILED,那麼應該從返回值中減去 WAIT_OBJECT_0。產生的數字是作為第二個參數傳遞給WaitForMultipleObjects的句柄數組中的索引。該索引説明哪個對象變 為已通知狀態。
dwMilliseconds參數的作用與它在WaitForSingleObject中的作用完全相同。如果在等待的時候規定的時間到了,那麼該函數無論如何都會返回。同樣,通常為該參數傳遞INFINITE,但是在編寫代碼時應該小心,以避免出現死鎖情況。
WaitForSingleObject
DWORD WaitForSingleObject( HANDLE hHandle, DWORDdwMilliseconds);
有兩個參數,分別是THandle和Timeout(毫秒單位),hHandle是一個事件的句柄,第二個參數dwMilliseconds是時間間隔。
WaitForSingleObject函數用來檢測hHandle事件的信號狀態,當函數的執行時間超過dwMilliseconds就返回,但如果參數dwMilliseconds為INFINITE時函數將直到相應時間事件變成有信號狀態才返回,否則就一直等待下去,直到WaitForSingleObject有返回直才執行後面的代碼
它可以等待如下幾種類型的對象:
Event,Mutex,Semaphore,Process,Thread
有三種返回類型:
WAIT_OBJECT_0, 表示等待的對象有信號(對線程來説,表示執行結束);
WAIT_TIMEOUT, 表示等待指定時間內,對象一直沒有信號(線程沒執行完);
WAIT_ABANDONED 表示對象有信號,但還是不能執行 一般是因為未獲取到鎖或其他原因
CreateMutex
作用是找出當前系統是否存在指定進程的實例。如果沒有則創建一個互斥體。
CreateMutex()函數可用來創建一個有名或無名的互斥量對象,其函數原型為:
HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全屬性的指針
BOOL bInitialOwner, // 初始化互斥對象的所有者
LPCTSTR lpName // 指向互斥對象名的指針
);
如果函數成功執行,將返回一個互斥量對象的句柄。如果在CreateMutex()執行前已經存在有相同名字的互斥量,函數將返回這個已經存在互斥量的句柄,並且可以通過GetLastError()得到錯誤代碼ERROR_ALREADY_EXIST。可見,通過對錯誤代碼ERROR_ALREADY_EXIST的檢測可以實現CreateMutex()對進程的互斥。
建立互斥體,用來同步。如果一個線程獲取了互斥體,則要獲取該互斥體的第二個線程將被掛起,直到第一個線程釋放該互斥體。

handle關係

C++ 窗口對象與 HWND 之間的關係
在窗口對象是一個對象的C++CWnd類 (或派生的類) 的應用程序直接創建。它出現,並轉到應用程序的構造函數和析構函數調用的響應中。Windows窗口後,就是內部 Windows 數據結構,它對應的窗口,並會佔用系統資源時存在一個不透明句柄。Windows 窗口由"窗口句柄"(HWND),並創建後CWnd對象創建通過調用Create類的成員函數CWnd。通過程序調用或用户的操作,可能會銷燬窗口。窗口對象中存儲的窗口句柄m_hWnd成員變量。下圖顯示了之間的關係C++窗口對象和 Windows 窗口。在討論創建 windows創建 Windows。中介紹了銷燬窗口銷燬窗口對象。

handle差別

handle與HWND的差別
HANDLE(句柄)是Windows操作系統中的一個概念。在Windows程序中,有各種各樣的資源(窗口、圖標、光標等),系統在創建這些資源時會為它們分配內存,並返回標示這些資源的標示號,即句柄。句柄指的是一個核心對象在某一個進程中的唯一索引,而不是指針。由於地址空間的限制,句柄所標識的內容對進程是不可見的,只能由操作系統通過進程句柄列表來進行維護。句柄列表:每個進程都要創建一個句柄列表,這些句柄指向各種系統資源,比如信號量,線程,和文件等,進程中的所有線程都可以訪問這些資源。
其實我們編程時輸出一下句柄的值就可以發現這些值往往非常小(<100)。由此就可以看出句柄的性質了。
無效的返回值為: INVALID_HANDLE_VALUE
HWND一般是用來定義窗口句柄的。HANDLE是用來定義任何類型的句柄,(Handletoanobject).包括HWND。可以理解為HWND是HANDLE的一個特例,用來表示一個窗口。
參考資料
  • 1.    handle百度釋義  .百度在線翻譯.2012-09-08[引用日期2012-09-08]
  • 2.    李宗義, 徐華. 用C++和WINDOWS開發面向對象的軸承設計專家系統[J]. 計算機輔助工程, 1995(2).