定義
HINSTANCE 是“句柄型”數據類型。相當於裝入到了記憶體的資源的ID。HINSTANCE對應的資源是instance.句柄實際上是一個 無符號長整數。但它是“句柄型”,所以你不能把它當成真的無符號長整數,拿來派別的用處,例如,不能拿來做四則運算。HINSTANCE常出現在 API 程式:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow){ //這裡放API主程式內容 if(!InitWindowsClass(hInstance)) return FALSE; if(!InitWindows(hInstance, nCmdShow)) return FALSE; ShowWindow(hWndMain, nCmdShow); ....}BOOL InitWindowsClass(HINSTANCE hInstance){ WNDCLAS Swndclass; .... wndclass.hIcon = LoadIcon(hInstance, "abcd.ico"); wndclass.hInstance = hInstance; .....}//子程式:BOOL InitWindows(HINSTANCEh Instance, int nCmdShow){ HWND hWnd; .... hWnd = CreateWindow("WindowsFill", str, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); ....}
區別
程式使用HINSTANCE來區別task。
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函式,格式為:
int LoadString(HINSTANCE hInstance,UINT uID,LPTSTR lpBuffer,int nBufferMax);
其中第2個參數uID,表示裝載(Load)的是第幾個信息。下面的程式將把程式的名稱(IDS_APP_TITLE)信息顯示在訊息視窗中。
//second.cpp:定義應用程式的入口點。//////第2個例子//吳新2008/01/06#include"stdafx.h"#include"second.h"intAPIENTRY_tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow){const int BUFSIZE=256;TCHAR wAppTitle[BUFSIZE];//初始化全局字元串LoadString(hInstance,IDS_APP_TITLE,wAppTitle,BUFSIZE);//獲取桌面句柄HWND hWnd=GetDesktopWindow();//將wAppTitle顯示在訊息視窗中MessageBox(hWnd,wAppTitle,_T("第2個例子"),MB_OK);return0;}
程式運行後將顯示如下的視窗:
補充
hInstance是作業系統分配給實例的
指針. 程式根據hInstance訪問其相應的記憶體空間
hInstance是作業系統分配給程式自身實例的句柄.句柄是用來標識實例的,句柄是實例指針的索引. 通過句柄能找到實例的地址.
HINSTANCE hInstance;是應用程式的實例句柄
獲取方法 HINSTANCE AfxGetInstanceHandle( );
或者AfxGetApp( );
得到一個CWINAPP類的指針,其中有該句柄的成員
nCmdShow,你有SDK經驗就知道,它是主視窗的狀態,也就是WinMain(...)的參數之一
實際上HINSTANCE並非純粹意義上的句柄(HANDLE),因為它實際上是由物理PE檔案映射到WINDOWS進程的虛擬模組首地址,這個地址上包含了PE頭信息和PE檔案映射後的具體內容,微軟將之作為句柄來體現在原因在於PE頭過於複雜,使用者直接對PE結構進行訪問不安全,這種編程手法在C語言編程中很常見,對於使用者而言,HINSTANCE的意義在於對WINDOWS資源進行訪問,也可以將它作為HMODULE來訪問模組的導出函式等等。