複製鏈接
請複製以下鏈接發送給好友

HINSTANCE

鎖定
一般用於window窗口程序, 在win32下與HMODULE是相同的東西,在Win32下還存在主要是因為win16
外文名
HINSTANCE
類    型
“句柄型”數據類型

HINSTANCE定義

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主要區別

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