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

InitInstance

鎖定
InitInstance是一個虛函數
中文名
InitInstance
重    載
虛函數
初    始
Dos頭
示    例
AppWizard
返回值
如果初始化成功,則返回非零值

InitInstance函數格式

CWinApp::InitInstance
virtual BOOL InitInstance( );

InitInstance返回值

如果初始化成功,則返回非零值;否則返回0。
InitInstance函數的返回值BOOL類型,所謂的BOOL(布爾)類型,在C語言中就是int,它實際就是一個宏定義
typedef int BOOL
通常我們使用BOOL類型來決定“是”以及“否”,“是”就是TRUE,“否”就是FALSE。TRUE和FALSE的值就是1和0,它們也是通過宏來直接定義的常量。

InitInstance註釋

Windows允許在同一時刻運行程序的幾份拷貝。在概念上,應用程序的初始化可以被分為兩個部分:一次性的應用程序初始化工作,這些在應用程序第一次運行時完成,以及實例的初始化工作,每次運行程序的一個拷貝時都會執行這些操作,包括第一次運行時。框架中WinMain實現調用這個函數。
重載InitInstance以初始化在Windows下運行的應用程序的每個新實例。通常,你重載InitInstance以構造主窗口對象並設置CWinThread::m_pMainWnd數據成員,使其指向這個窗口。有關重載這個成員函數的更多信息參見“Visual C++ 程序員指南”中的“ CWinApp:應用程序類”。

InitInstance示例

// AppWizard 根據你選擇的選項實現重載的InitInstance函數。
// 例如,對於下面由AppWizard創建的代碼,選擇了單文檔界面(SDI)選項。
// 你可以在AppWizard創建的代碼中加入其它的每個實例都執行的初始化代碼。
BOOL CMyApp::InitInstance()
{
// 標準的初始化工作
// 如果你沒有使用這些特性,並且希望減小最終可執行程序的大小,
// 你應當從下面的初始化例程中移去不必要的代碼。
SetDialogBkColor(); // 將對話框的背景色設為灰色。
LoadStdProfileSettings(); // 載入標準的INI文件選項(包括MRU)
// 註冊應用程序的文檔模板。文檔模板
// 被用作文檔、框架窗口和視圖之間的聯繫。
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMainFrame), // SDI的主框架窗口
RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);
// create a new (empty) document
OnFileNew();
if (m_lpCmdLine[0] != '\0')
{
// 創建一個新(空的)文檔
}
return TRUE;
}
學過PE文件格式,你就明白,程序在進入WinMain之前要做很多事情,比如初始Dos頭,分配函數表,初始化全局變量。之後才進入程序入口(WinMain)
MFC對WindowsAPI進行了封裝。在用嚮導編譯成的二進制代碼,MFC編譯器鏈接器源文件編譯成PE文件格式存儲在磁盤上。程序執行的時候,從PE文件頭開始執行,在進入Winmain函數之前,進行一系列的必備的初始化。 MFC對這一系列的過程進行了封裝。提供給編程人員的第一個裸露程序入口就是CWinApp的InitInstance(),其實程序的入口依然是WinMain()函數。大家都知道,每個程序都有擁有一個進程,每個進程至少有一個線程就是主線程CWinThread類是MFC用來封裝線程的,這個主線程就是在WinMain函數中創建的,包括UI線程和工作者線程。因此每個MFC程序至少使用一個CWinThread派生類。被MFC程序員熟知的CWinApp應用類就從這裏派生。
InitInstance是CWinThread的一個虛函數,InitInstance就是“初始化實例”的意思,可見,它是在實例創建時首先被調用的。應用程序總要重載這個虛函數,進行系統設置,創建運行環境。例如,主窗口一定要在InitInstance()中創建,因為該函數退出後就進入該線程的消息循環
MFC執行流程: _tWinMain(WinMain的別名,用define替換的)->AfxWinMain->初始化線程,調用InitInstance初始化窗口,調用Run函數進入消息循環。