Windows API一日一練(2)使用應用程式控制代碼
來源:互聯網
上載者:User
從上面這段程式就可以看到,_tWinMain是應用程式的入口函數,這裡是使用它的宏,定義在tchar.h標頭檔裡,為什麼要這樣作宏定義的呢?由於Windows的應用程式要適應UNICODE和以前單字元的應用程式,由於Windows這兩個API的定義是不一樣的,如下:
UNICODE的定義:
#define _tWinMain wWinMain
單字元的定義:
#define _tWinMain WinMain
只要經過這樣的宏定義後,就可以適應不同字元寬度的函數介面了。由於我是採用UNICODE編譯的,所以這裡使用wWinMain函數定義,下面再把它的定義找出來,如下:
int
WINAPI
wWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
int nShowCmd
);
這裡要詳細地解釋一下函數wWinMain的參數,它有四個參數。
hInstance是當前應用程式的執行個體控制代碼,一般用來區分不同的資源使用。
hPrevInstance是以前Win98使用的控制代碼,在Win2000以後的作業系統裡都是空值NULL。
lpCmdLine是命令列參數,比如你在Windows開始菜單裡運行一個程式,並添加參數在後面,就會傳遞給應用程式,後面再詳細討論。
nShowCmd是視窗的顯示方式,比如最大化顯示,最小化顯示,還是正常顯示。
Windows運行程式時,是通過運行庫裡的啟動代碼來調用wWinMain函數,它是在開機檔案裡如下調用:
#ifdef WPRFLAG
mainret = wWinMain(
#else /* WPRFLAG */
mainret = WinMain(
#endif /* WPRFLAG */
(HINSTANCE)&__ImageBase,
NULL,
lpszCommandLine,
StartupInfo.dwFlags & STARTF_USESHOWWINDOW
? StartupInfo.wShowWindow
: SW_SHOWDEFAULT
);
這就是作業系統傳遞給應用程式的值,現在就來示範使用第一個參數hInstance。
請看下面的例子:
#001 #include "stdafx.h"
#002 #include "First.h"
#007 //
#008 int APIENTRY _tWinMain(HINSTANCE hInstance,
#009 HINSTANCE hPrevInstance,
#010 LPTSTR lpCmdLine,
#011 int nCmdShow)
#012 {
#013 UNREFERENCED_PARAMETER(hPrevInstance);
#014 UNREFERENCED_PARAMETER(lpCmdLine);
#015 UNREFERENCED_PARAMETER(nCmdShow);
#016
#017 //使用應用程式控制代碼
#018 const int MAXSIZE_APPBUF = 256;
#019 TCHAR wAppTile[MAXSIZE_APPBUF];
#020 LoadString(hInstance,IDS_APP_TITLE,wAppTile,MAXSIZE_APPBUF);
#021
#022 //擷取案頭的控制代碼。
#023 HWND hWnd = GetDesktopWindow();
#024
#025 //顯示一行訊息。
#026 MessageBox(hWnd, _T("第一個應用程式"), wAppTile, MB_OK);
#027
#028 //
#029 return 0;
#030 }
這個例子是在前面的基礎上修改的,主要添加了使用應用程式執行個體控制代碼。在第19行裡定義了一個儲存應用程式標題的緩衝區,然後在第20行裡調用函數
LoadString從應用程式的資源裡載入字串,它的第一個參數就使用到hInstance控制代碼。因此應用程式控制代碼是表示程式在資源上唯一的標識符。