运行一开始,AfxWinMain就调用AfxWinMain函数来初始化主框架,并将hInstance,nCmdShow以及其他AfxWinMain函数参数复制给应用程序
对象的数据成员,然后它调用InitApplication和InitInstance。在MFC的16位版本中,只有传递给AfxWinMain的hPrevInstance参数是空时才调用InitApplication,这表明当前运行的是应用程序的唯一实例。在Win32环境下,hPrevInstance总是空的,因此主框架不必再去检查。32位应用程序能够像使用InitInstance一样方便的使用InitApplication初始化自身,但是InitApplication是为保证MFC先前版本的兼容性而提供的,因此不必应该在32位windows应用程序中使用。如果AfxWinInti,InitApplication或者InitInstance返回0值,则AfxWinMain终止而不是继续运行,应用程序被关闭。只有在上述函数返回非零的值时,AfxWinMain才执行以下关键的步骤。语句pThread->Run();调用应用程序对象的Run函数,该函数执行消息循环并开始向应用程序窗口发送消息。消息循环重复执行,直到WM_QUIT消息从消息队列中被检索到。这时Run跳出循环并调用ExitInstance,返回AfxWinMain中。在执行了最后的一些清除工作后,AfxWinMain执行一个return语句结束应用程序。
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL);
int nReturnCode = -1;
CWinThread* pThread = AfxGetThread();
CWinApp* pApp = AfxGetApp();
// AFX internal initialization
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
goto InitFailure;
// App global initializations (rare)
if (pApp != NULL && !pApp->InitApplication())
goto InitFailure;
// Perform specific initializations
if (!pThread->InitInstance())
{
if (pThread->m_pMainWnd != NULL)
{
TRACE0("Warning: Destroying non-NULL m_pMainWnd/n");
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
nReturnCode = pThread->Run();
InitFailure:
#ifdef _DEBUG
// Check for missing AfxLockTempMap calls
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;
}