tft每日頭條

 > 圖文

 > 句柄在線程中創建如何退出

句柄在線程中創建如何退出

圖文 更新时间:2024-08-03 20:08:23
蠍子

在今天的時代,它們兩者已經是同一個東西了,但是在過去的一段時間裡,它們确實指代不同的東西。這個過去的時間,實際是遠古時期的16位Windows時代。那個時候,一個模塊(module)表示一個從磁盤加載到内存的文件,而模塊句柄(HMODULE)則表示指向文件内存數據結構的句柄,這個數據結構表達了文件的存放位置,已經被加載到了内存的哪個位置(如果有的話)。

另一方面,一個實例(instance)則代表了一個變量集合。

一個類比就是:模塊有點像C 類的代碼,它描述了如何構造一個對象,如何實現對象的方法,還描述了類對象的各種行為。

而實例有點像C 類的對象,它描述了特定對象的特定狀态。在C#術語中,一個模塊有點像類型,而一個實例有點像對象。下圖中展示了模塊和實例的不同之處。

句柄在線程中創建如何退出(說說實例句柄和模塊句柄的區别)1

在16位Windows時代,所有的進程都在同一個地址空間,如果一個DLL被5個應用程序使用了,則它隻會被加載到内存中一次。特别的,它隻會有一個數據段的拷貝。(在C /C#術語中,一個DLL有點像單例類。) 的确如此,DLL是系統全局的,而不是屬于單個進程。DLL不會在每個加載它的進程中獲得一份數據的拷貝。如果這個對于你的DLL來說很重要,則你不得不自己動手記錄這些信息。如果以一種更加技術性的方式來描述,系統中隻會有一個DLL的實例。

相對的,如果你運行兩個記事本程序,則它們中的每一個會保持一份自己的變量集合,也即它們是兩個實例,請看下圖:

句柄在線程中創建如何退出(說說實例句柄和模塊句柄的區别)2

這兩個記事本的實例共享一個NOTEPAD模塊(因此,代碼和資源得到了共享),但是每個實例都會有自己的一份變量的拷貝(獨立的數據段)。所以我們說有兩個記事本實例。

在上圖中,實例句柄指的是數據段,系統通過實例句柄來識别每個運行中的程序,這個時候,你不可以使用模塊句柄,因為兩個記事本的模塊句柄是同一個東西(記事本的代碼都是一樣的)。使它們互相區分的一個東西是它們各自都擁有一份自己的全局變量結合。這就是為什麼WinExec和ShellExecute這兩個函數返回實例句柄的原因。它們是16位Windows系統的殘留,那個時候,實例用來識别運行中的程序。

到了Win32的時代,設計者們碰到了一問題:對于Win32來說,應該如何處理實例句柄和模塊句柄呢?因為在Win32中,每個程序都運行在各自獨立的地址空間中,實例句柄根本不會在進程邊界可見。因此,設計者選擇了唯一可以選擇的東西:模塊的加載地址。這個地址有點類似模塊句柄,因為文件頭描述了文件的内容和結構。而且,因為它也十分類似實例句柄,因為數據被保留在了進程的數據段。所以,在Win32中,實例句柄和模塊句柄都是模塊的加載地址。

總結

所以,大家寫程序的時候,不用太關心HINSTANCE和HMODULE的區别,因為它們也沒啥大區别。

最後

Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,裡面有很多關于Windows的小知識,對于廣大Windows平台開發者來說,确實十分有幫助。本文來自:《What is the difference between HINSTANCE and HMODULE?》

句柄在線程中創建如何退出(說說實例句柄和模塊句柄的區别)3

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved