1. 程式人生 > >Windows中句柄和ID的區別

Windows中句柄和ID的區別

程序員 之間 spa nload 資源 das 語句 導致 arr

VC++菜單的句柄也可以理解成菜單的識別符(ID). 但如果指菜單項的ID, 那可能又是一回事了。按我的理解:  1. 句柄是程序運行中系統為其分配的,菜單項ID是編程者自己定義指定的。一般可在資源文件中定義也可在動態創建菜單時指定,程序中引用。  2. 菜單的句柄是屬於菜單的,菜單項ID是屬於菜單中某一個菜單項的。編程者通過菜單的句柄訪問菜單,通過ID進行菜單項識別並進行消息處理。  3. 菜單的句柄類型是HMENU, 菜單項ID的類型是UINT(無符號整型)。當然這兩種類型本質上並無差別,但編程者一般不混用。當然不排除強制類型轉換,如有(HMENU)id.  4. 如果某菜單項是子菜單或下拉菜單,則動態創建插入該菜單項時, 子菜單或下拉菜單的句柄用作該菜單項的ID. 這時則有(UINT)hSubMenu的用法。 5.一個window對應一個句柄,一個控件可以對應一個ID

每個對象(如果需要)都有一個唯一的ID用來標示自己。而Handle則是另外一個實體(比如你的程序)為了處理其它的對象而得到的一個標示,這個標示只對操作主體有效,而且不同的操作主體擁有的同一個對象的Handle沒有理由一定相同。
例如,每一個系統內存在的Process都有一個可以在系統內區別於其它Process的ID。而Process Handle,只有在其它的某個實體處理它時,對它進行一個Open操作(OpenProcess(),?),才能的到這個操作主體內與被操作的Process相關的Handle.

句柄和ID

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

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

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

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

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

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

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

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

總之,如果試圖解釋他到底是什麽,學習句柄就會誤入歧途。從虛的角度去理解,對於新手是難一點,但是這也許是唯一正確的辦法。

句柄一般是操作系統避免你直接對某個對象數據結構進行操作而引入的,可以通過句柄來使用某個對象,而不用知道句柄的內容。

句柄是一種指向指針的指針。我們知 道,所謂指針是一種內存地址。應用程序啟動後,組成這個程序的各對象是住留在內存的。如果簡單地理解,似乎我們只要獲知這個內存的首地址,那麽就可以隨時用這個地址訪問對象。但是,如果您真的這樣認為,那麽您就大錯特錯了。我們知道,Windows是一 個以虛擬內存為基礎的操作系統。在這種系統環境下,Windows內存管理器經常在內存中來回移動對象,依此來滿足各種應用程序的內存需要。對象被移動意味著它的地址變化 了。如果地址總是如此變化,我們該到哪裏去找該對象呢?為了解決這個問題,Windows操作系統為各應用程序騰出一些內存儲地址,用來專門登記各應用對象在內存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。 Windows內存管理器在移動對象在內存中的位置後,把對象新的地址告知這個句柄地址來保存。這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內存中的哪個位置。這個地址是在對象裝載(Load)時由系統分配給的,當系統卸載時(Unload)又釋放給系統。句柄地址(穩定)→記載著對象在內存中的地址→對象在內存中的地址(不穩定)→實際對象。但是,必須註意的是程序每次從新啟動,系統不能保證分配給這個程序的句柄還是原來的那個句柄,而且絕大多數情況的確不一樣的。假如我們把進入電影院看電影看成是一個應用程序的啟動運行,那麽系統給應用程序分配的句柄總是不一樣,這和每次電影院售給我們的門票總是不同的一個座位是一樣的道理。

句柄和控件ID的區別

你的家庭現在就好比是一個程序(窗體也是程序的一部分,實際窗體、控件都是由命令語句動態構建的,只是省了你自己寫代碼而已,autoit的窗體和控件好像就只能用代碼構建,和vb還不一樣),控件ID就好像你的名字,一般一個家庭(程序)裏的眾多成員(控件)之間是不會重名的,每個人在自己家(程序)裏的名字(控件ID)都是唯一的,當你的家人(程序代碼)需要找你,叫你名字的時候就直接稱呼你的名字(控件ID)。

但是全國無數個家庭,就可能會有重名了吧,於是政府(系統)就不管你的名字(控件ID)是什麽,直接分配給每個人(控件)一個身份證號碼(句柄),公安局(其他程序)來找你(一個控件)的時候就使用你的身份證號(句柄)來保證在全國(內存)範圍裏也不會把你弄錯。

每個家庭組成以後(運行了一個新程序),生下了小寶寶(構建新的控件)就會得到一個全國(內存)唯一的一個身份證號(句柄),以保證在國內(內存)的唯一性。當一個家庭的成員壽終正寢(控件銷毀)的時候,身份證號碼(句柄)同時被作廢(系統收回,以後分配給新產生的控件)。

是“句柄”(handle),handle的本意是把柄,把手的意思。是你與操作系統打交道的東東。舉個通俗的例子,比如你考上了大學,入學後,學校(操作系統)會給你一個學生證號。註意,這個號碼是學校指定的,你無法自選。有了這個號碼(學生證,假設一證多用)享受學校提供的服務:如你就可以去圖書館借書,去食堂吃飯,去教室上課等等。但你不能到食堂裏買啤酒,因為學校不允許這種服務。而在計算機中系統提供的服務就是API調用,你有了HANDLE,就可以理直氣壯地向系統提出調用API的服務。而指針的權力就大多了,有了指針你可以到處去喝酒,打架,學校(操作系統)管不著,所以句柄和指針的區別在於句柄只能調用系統提供的服務。而句柄雖然是一個能相互區別的號碼,但與我們普通的ID號又有區別,普通的ID號是可以由程序員自己定義的,而句柄不行,它是對象生成時系統指定的,是為了區別系統中存在的各個對象,這個句柄不是由程序員符給的。

句柄

1.句柄,是整個windows編程的基礎,一個句柄是指使用的一個唯一的整數值,是指一個四字節長的數值,用於標誌應用程序中的不同對象和同類對象中的不同的實例,諸如,一個窗口,按鈕,圖標,滾動條,輸出設備,控件或者文件等。應用程序能夠通過句柄訪問相應的對象的信息。

2.句柄不是一個指針,程序不能利用它句柄來直接閱讀文件中的信息。如果句柄不用在I/O文件中,它是毫無用處的。

3.句柄是windows用來標誌應用程序中建立的或是使用的唯一整數,windows使用了大量的句柄來來標誌很多對象。

說明:實例——在windows環境下,不但可以運行多個應用程序,還可以運行多個應用程序的多份拷貝,每個拷貝叫做一個實例,並且有不同的實例句柄。一個實例句柄是windows可以單獨運行的副本,是唯一可以標誌此實例的整數

Windows中句柄和ID的區別