_tWinMain 与wWinMain 区别

_tWinMain 与wWinMain 区别(转)


MFC封装了WIN API.大家都知道.但是MFC应用程序的真正流程又有多少人知道呢? 
下面就是我对MFC启动代码的一些剖析.
在TCHAR.H里,有这么2小段define.通过我的简化,我们可以看到:
//TCHAR.H 
#ifdef _UNICODE 
#define _tWinMain wWinMain 
#else 
#define _tWinMain WinMain 
#endif


   由于为了支持UNICODE,C运行库对WinMain其实区分了UNICODE版和ANSI版.对UNICODE版的程序,C运行库将调用wWinMain,而对于ANSI版的应用,则调用WinMain.这是第一点.
   然后,其实MFC的代码设计时是自动支持UNICODE的,所以,MFC的WinMain在APPMODUL.CPP被定义为 
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) 
   这样以一来,无论用户#define _UNICODE与否,MFC的WinMain都会被调用.接下来,_tWinMain的实际运作如下:


extern "C" int WINAPI 
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
 LPTSTR lpCmdLine, int nCmdShow) 

// call shared/exported WinMain 
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); 
}


   这样,AfxWinMain就和MFC挂上了钩.甚至在PETER NORTON的书中,都仅讲到了AfxWinMain乃是MFC的WinMain,但是,NORTON同志看来没有讲述清楚这点.因为,WinMain仍然是WinMain,C运行库并没有因为MFC的存在而重新设计AfxWinMain的入口. 
在MS的AfxWinMain(WINMAIN.CPP)里我们可以看到如下代码: 

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; 
}


你可能感兴趣的:(VC)