句柄和ID
在Windows程序設(shè)計中,句柄是無法精確定義的術(shù)語。隨便找一個高手,讓他給你講講句柄是什么,恐怕他都很難給你一個具體的定義來。
在Windows程序設(shè)計中,句柄無所不在,窗口有窗口的句柄HWND,線程和進程也有句柄HANDLE,甚至有人把套接字也稱為句柄(我就是這樣的)。
句柄在英文中是handle,作為動詞講是處理的意思。簡而言之,句柄是處理對象的一個接口,對于程序中所涉及的對象,你可以通過句柄去操作他。你不應(yīng)該試圖去回答句柄是什么,而應(yīng)該從務(wù)虛的角度去理解他,知道他干什么即可。
有人說,因為handle的定義是void *,因此他是一個指針。有些熟悉內(nèi)核的人說這是一個索引。這些說法都是不準確的。需要注意的是,微軟并沒有精確定義句柄的含義,也許在某個特殊的操作系統(tǒng)中,他使用了一種內(nèi)部含義,但是在其他版本中,就不保證這樣了。任何對句柄的內(nèi)在假設(shè)都可能導(dǎo)致災(zāi)難性的后果。
API是接口,句柄是接口,兩者有什么區(qū)別?API是一個通用的函數(shù)族,他處理所有的對象,而句柄是和某個具體對象相關(guān)聯(lián)的數(shù)據(jù)結(jié)構(gòu)。只有借助句柄,API才知道處理哪個對象。
有些對象有ID。句柄表示特殊的對象,ID也表示某個對象,為什么要兩個東西來表示?
首先,句柄不能唯一表示對象。一個對象可以有多個句柄。例如:假設(shè)我們用CreateProcess創(chuàng)建一個進程,該進程的第一個線程的句柄會返回給調(diào)用CreateProcess的進程。同時,在新創(chuàng)建的進程中,該線程也會有一個句柄。這樣,這個線程就有兩個句柄。我們也可以用DuplicateHandle復(fù)制一個句柄,這個句柄和原來句柄是不一樣的,但是他們都表示同一個對象。而每個有ID的對象,在系統(tǒng)范圍內(nèi),ID肯定是唯一的。
其次,句柄所能實現(xiàn)的功能ID不能實現(xiàn)。畢竟ID只是一個數(shù)字,他不能記錄很多信息。而句柄可能在其內(nèi)部結(jié)構(gòu)中記錄了很多信息(如權(quán)限、有無信號等)。
總之,如果試圖解釋他到底是什么,學(xué)習(xí)句柄就會誤入歧途。從虛的角度去理解,對于新手是難一點,但是這也許是唯一正確的辦法。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。