句柄和ID

在Windows程序設計中,句柄是無法精確定義的術語。隨便找一個高手,讓他給你講講句柄是什麼,恐怕他都很難給你一個具體的定義來。

在Windows程序設計中,句柄無所不在,窗口有窗口的句柄HWND,線程和進程也有句柄HANDLE,甚至有人把套接字也稱爲句柄(我就是這樣的)。

句柄在英文中是handle,作爲動詞講是處理的意思。簡而言之,句柄是處理對象的一個接口,對於程序中所涉及的對象,你可以通過句柄去操作他。你不應該試圖去回答句柄是什麼,而應該從務虛的角度去理解他,知道他幹什麼即可。

有人說,因爲handle的定義是void *,因此他是一個指針。有些熟悉內核的人說這是一個索引。這些說法都是不準確的。需要注意的是,微軟並沒有精確定義句柄的含義,也許在某個特殊的操作系統中,他使用了一種內部含義,但是在其他版本中,就不保證這樣了。任何對句柄的內在假設都可能導致災難性的後果。

API是接口,句柄是接口,兩者有什麼區別?API是一個通用的函數族,他處理所有的對象,而句柄是和某個具體對象相關聯的數據結構。只有藉助句柄,API才知道處理哪個對象。

有些對象有ID。句柄表示特殊的對象,ID也表示某個對象,爲什麼要兩個東西來表示?

首先,句柄不能唯一表示對象。一個對象可以有多個句柄。例如:假設我們用CreateProcess創建一個進程,該進程的第一個線程的句柄會返回給調用CreateProcess的進程。同時,在新創建的進程中,該線程也會有一個句柄。這樣,這個線程就有兩個句柄。我們也可以用DuplicateHandle複製一個句柄,這個句柄和原來句柄是不一樣的,但是他們都表示同一個對象。而每個有ID的對象,在系統範圍內,ID肯定是唯一的。

其次,句柄所能實現的功能ID不能實現。畢竟ID只是一個數字,他不能記錄很多信息。而句柄可能在其內部結構中記錄了很多信息(如權限、有無信號等)。

總之,如果試圖解釋他到底是什麼,學習句柄就會誤入歧途。從虛的角度去理解,對於新手是難一點,但是這也許是唯一正確的辦法。  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章