_tWinMain과 wWinMain의 차이점
2462 단어 VC
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
VB에서 VC로 작성된 DLL을 호출하는 방법 공유이 두 가지가 있으면 VC를 사용하는 수조처럼 처리할 수 있습니다.도면을 내보내는 경우 WMF 또는 BMP 형식을 생성하여 VB를 호출할 수 있습니다.그러나 나는 VB가 창의 핸들 hWnd와 hDC, 그리고 창의 그...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.