HINSTANCE

常出現在API程序的數據類型

win32下與HMODULE是相同的東西,在Win32下還存在主要是因為win16

定義


HINSTANCE 是“句柄型”數據類型。相當於裝入到了內存的資源的ID。HINSTANCE對應的資源是instance.句柄實際上是一個 無符號長整數。但它是“句柄型”,所以你不能把它當成真的無符號長整數,拿來派別的用處,例如,不能拿來做四則運算。HINSTANCE常出現在 API 程序:

區別


程序使用HINSTANCE來區別task。
Handle 是代表系統的內核對象,如文件句柄,線程句柄,進程句柄。
HMODULE 是代表應用程序載入的模塊,win32系統下通常是被載入模塊的線性地址。
HINSTANCE 在win32下與HMODULE是相同的東西,在Win32下還存在主要是因為win16
程序使用HINSTANCE來區別task。
HWND 是窗口句柄
熟悉C編程的人都知道main函數帶有2個參數:argc和argv,完整的main函數定義是:int main(int argc, char *argv[])。argc指示程序啟動時命令行參數的個數,argv則包含具體的參數字元串。
如果有程序叫“hello.exe”,直接啟動時,argc=1, argv[0]=hello.exe。
如果以“hello.exe readme.txt”的形式啟動,argc=2, argv[0]=hello.exe, argv[1]=readme.txt
通過這兩個參數,程序可以獲知自身在啟動時的命令行信息。
而在WinMain函數中,帶有4個參數,分別是:hInstance, hPrevInstance, lpCmdLine, nShowCmd。今天就探討hInstance的含義。
hInstance是程序的當前實例的句柄。在Windows這樣的多任務操作系統中,一個程序可以同時運行多個實例。不同的實例間需要彼此區別,句柄就是干這個的。
我們想辦法把句柄指示的信息顯示出來,用LoadString函數,格式為:
其中第2個參數uID,表示裝載(Load)的是第幾個信息。下面的程序將把程序的名稱(IDS_APP_TITLE)信息顯示在消息窗口中。
程序運行后將顯示如下的窗口:
HINSTANCE
HINSTANCE

補充


hInstance是操作系統分配給實例的指針. 程序根據hInstance訪問其相應的內存空間
hInstance是操作系統分配給程序自身實例的句柄。句柄是用來標識實例的,句柄是實例指針的索引. 通過句柄能找到實例的地址.
HINSTANCE hInstance;是應用程序的實例句柄
獲取方法 HINSTANCE AfxGetInstanceHandle( );
或者AfxGetApp( );
得到一個CWINAPP類的指針,其中有該句柄的成員
nCmdShow,你有SDK經驗就知道,它是主窗口的狀態,也就是WinMain(...)的參數之一
實際上HINSTANCE並非純粹意義上的句柄(HANDLE),因為它實際上是由物理PE文件映射到WINDOWS進程的虛擬模塊首地址,這個地址上包含了PE頭信息和PE文件映射后的具體內容,微軟將之作為句柄來體現在原因在於PE頭過於複雜,使用者直接對PE結構進行訪問不安全,這種編程手法在C語言編程中很常見,對於使用者而言,HINSTANCE的意義在於對WINDOWS資源進行訪問,也可以將它作為HMODULE來訪問模塊的導出函數等等。