天天看點

VC++——應用程式執行機制之WinMain函數

小編要和大家分享的是WinMain函數,在DOS下,程式的執行是從main函數開始的。在Windows下,對應的函數是WinMain。但是,如果浏覽Hello程式的所有的方法和全局函數,是找不到WinMain函數的。MFC考慮到典型的Windows程式需要的大部分初始化工作都是标準化的,是以把WinMain函數隐藏在應用程式的架構中,編譯時會自動将該函數連結到可執行檔案中。程式員可以重寫WinMain函數,但一般不需要這麼做。

  下面的程式給出了WinMain函數的代碼。其中,_tWinMain函數在\DevStudio\Vc\Mfc\src\AppModul.cpp中定義,它所調用的AfxWinMain函數在同一目錄下的WinMain.cpp中定義。名字是_tWinMain函數而不是WinMain,是考慮到對不同字元集的支援,在tchar.h中有_tWinMain的宏定義。在ANSI字元集下編譯時,_tWinMain就變成WinMain,在Unicode下編譯時,_tWinMain就變成wWinMain。

提示:Unicode是具有固定寬度、統一的文本和字元的編碼标準。由于Unicode采用的是16位編碼,是以可以包含世界各地的書寫系統的字元和技術符号(如中文也在Unicode之中),進而克服了ASCII碼在表示多語言文本上的不足之處,擴大了ASCII碼7位編碼方案的好處。Unicode同等地對待所有的字元,并且在表示各種語言的任何字元時既不需要換碼序列(escape)也不需要控制代碼。Win32和Visual C++很好的支援Unicode字元集。

_tWinMain函數定義

extern int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPTSTR lpCmdLine, int nCmdShow);

#ifdef _MAC

extern "C" int PASCAL

#else

extern "C" int WINAPI

#endif

_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPTSTR lpCmdLine, int nCmdShow)

{

return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

}

AfxWinMain函數定義:

int AFXAPI AfxWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPTSTR lpCmdLine, int nCmdShow)

{

ASSERT(hPrevInstance == NULL);

int nReturnCode = -1;

CWinApp* pApp = AfxGetApp();

if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))

goto InitFailure;

ASSERT_VALID(pApp);

if (!pApp->InitApplication())

goto InitFailure;

ASSERT_VALID(pApp);

if (!pApp->InitInstance())

{

if (pApp->m_pMainWnd != NULL)

{

TRACE0("Warning: Destroying non-NULL m_pMainWnd\n");

pApp->m_pMainWnd->DestroyWindow();

}

nReturnCode = pApp->ExitInstance();

goto InitFailure;

}

ASSERT_VALID(pApp);

nReturnCode = pApp->Run();

ASSERT_VALID(pApp);

InitFailure:

#ifdef _DEBUG

if (AfxGetModuleThreadState()->m_nTempMapLock != 0)

{

TRACE1("Warning: Temp map lock count non-zero (%ld).\n",

AfxGetModuleThreadState()->m_nTempMapLock);

}

AfxLockTempMaps();

AfxUnlockTempMaps(-1);

#endif

 

AfxWinTerm();

return nReturnCode;

}

  應用程式執行時,Windows自動調用應用程式架構内部的WinMain函數。WinMain函數會查找該應用程式的一個全局構造對象,這個對象是由CWinApp派生類構造的,有且隻有一個。它是一個全局對象,是以在程式啟動時,它就已經被構造好了。

  随後,WinMain将調用這個對象的InitApplication和InitInstance成員函數,完成應用程式執行個體的初

始化工作。随後,WinMain調用Run成員函數,運作應用程式的消息循環。在程式結束時,WinMain調用AfxWinTerm函數,做一些清理工作。

轉載請注明出處:  程式員之家 http://www.sunxin.org/