1. 程式人生 > >模塊句柄(實例句柄)和句柄的區別

模塊句柄(實例句柄)和句柄的區別

句柄

看過windows核心編程的都知道有很多概念。同時如果你不只對windows有所了解,對linux mac等 *unix操作系統也有所了解的話。可能會出現有的東西都重合,而有的沒有。這裏說下win下句柄概念。
網上解釋:
解釋一:
1.模塊的概念

一個模塊代表的是一個運行中的exe文件或dll文件,用來代表這個文件中所有的代碼和資源,磁盤上的文件不是模塊,裝入內存後運行時就叫做模塊。一個應用程序調用其他DLL中的API時,這些DLL文件被裝入內存,就產生了不同的模塊,為了區分地址空間中的不同模塊,每個模塊都有一個惟一的模塊句柄來標識。Win16,Win16中不同運行程序的地址空間並非是完全隔離的,一個可執行文件運行後形成"模塊",多次加載同一個可執行文件時,這個"模塊"是公用的,為了區分多次加載的"拷貝",就把每個"拷貝"叫做實例,每個實例均用不同的"實例句柄"(hInstance)值來標識它們。但在Win32中,程序運行時是隔離的,每個實例都使用自己私有的4 GB空間,都認為自己是惟一的,不存在一個模塊的多個實例的問題,實際上在Win32中,實例句柄就是模塊句柄,但很多API原型中用到模塊句柄的時候使用的名稱還是沿用hInstance,所以我們還是把變量名稱取為hInstance。

在C語言的編程中,hInstance通過WinMain由系統傳入,WinMain的原型是:

WinMain(hInstance,hPrevInstance,lpzCmdParam,nCmdShow),程序不用自己去獲得hInstance,這個過程由C的初始化代碼代勞了,但在Win32匯編中hInstance必須自己獲取,如果不了解hModule就是hInstance的話,就無法得知如何得到hInstance,因為並沒有一個類似於GetInstanceHandle之類的API函數。

2.句柄是什麽

隨著分析的深入,句柄(handle)一詞也出現得頻繁起來,"句柄"是什麽呢?句柄只是一個數值而已,它的值對程序來說是沒有意義的,它只是Windows用來表示各種資源的編號而已,可見只有Windows才知道怎麽使用它來引用各種資源。

下面舉例說明。屏幕上已經有10個窗口,Windows把它們從1到10編號,應用程序又建立了一個窗口,現在Windows把它編號為11,然後把11當做窗口句柄返回給應用程序,應用程序並不知道11代表的是什麽,但在操作窗口的時候,把11當做句柄傳給Windows,Windows自然可以根據這個數值查出是哪個窗口。當該窗口關閉的時候,11這個編號作廢。第二次運行的時候,如果屏幕上現有5個窗口,那麽現在句柄可能就是6了,所以,應用程序並不用關心句柄的具體數值是多少。打個比方,可以把句柄當做是商場中寄放書包時營業員給的紙條,紙條上的標記用戶並不知道是什麽意思,但把它交還給營業員的時候,她自然會找到正確的書包。

Windows中幾乎所有的東西都是用句柄來標識的,文件句柄、窗口句柄、線程句柄和模塊句柄等,同樣道理,不必關心它們的值究竟是多少,拿來用就是了!

解釋二:

在WINDOWS下,模塊指的是EXE和DLL等數據加載到內存中的影像,模塊句柄又是比較特殊的,它跟一般的句柄不一樣,模塊句柄指向的就是EXE和DLL等的在內存的位置(就是指向它們的數據起始位置,也就是加載基址);進程句柄只是WINDOWS用來標識某個進程的ID值罷了,在內部,WINDOWS使用一種類似MAP的技術來進行映射的,就是通過這個進程句柄來找到指定進程在內存的位置。

這裏再說明下: 句柄在系統內核中是用一個句柄表表示的,每個內核對象在系統中只有一個。句柄值就是句柄表中的一個下標(偏移)。

模塊句柄(實例句柄)和句柄的區別