_tWinMain과 wWinMain의 차이점

2462 단어 VC
_tWinMain과 wWinMain의 차이점 (회전)
MFC의 WIN API. 캡슐화다들 아시겠지만.하지만 MFC 애플리케이션의 진정한 프로세스를 아는 사람은 얼마나 될까? 
다음은 제가 MFC 부팅 코드에 대한 분석입니다.
TCHAR에서H에 이렇게 두 소절 define이 있어요.단순화를 통해 다음과 같은 이점을 얻을 수 있습니다.
//TCHAR.H 
#ifdef _UNICODE 
#define _tWinMain wWinMain 
#else 
#define _tWinMain WinMain 
#endif
UNICODE를 지원하기 위해서 C 라이브러리는 WinMain에 대해 UNICODE 버전과 ANSI 버전을 구분합니다.UNICODE 버전의 프로그램은 C 라이브러리에서 WinMain을 호출하고 ANSI 버전의 프로그램은 WinMain을 호출합니다.이게 첫 번째야.
그리고 사실 MFC의 코드는 디자인할 때 UNICODE를 자동으로 지원하기 때문에 MFC의 WinMain은 APPMODUL에 있습니다.CPP는
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) 
이렇게 하면 사용자에 관계없이 #defineUNICODE 또는 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의 책에서 Afx WinMain은 MFC의 WinMain이라고 말했을 뿐이다. 그러나 NORTON 동지는 이 점을 분명히 설명하지 못한 것 같다.WinMain은 여전히 WinMain이기 때문에 C 라이브러리는 MFC의 존재로 인해 Afx WinMain의 입구를 다시 설계하지 않았다. 
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
"); 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).
", AfxGetModuleThreadState()->m_nTempMapLock); } AfxLockTempMaps(); AfxUnlockTempMaps(-1); #endif AfxWinTerm(); return nReturnCode; }

좋은 웹페이지 즐겨찾기