

Программирование на языке MFC
Мой второй блог в серии программирования
Функция WinMain
Вот с этих-то строк все и начинается. Командная строка записывается в переменную IpszCommandLine, анализируется, затем готовится структура типа STARTUPINFO, после чего вызывается функция WinMain(). Обратим внимание, с какими аргументами запускается эта функция.
Первым аргументом этой функции должен быть хэндл текущей копии приложения. Вместо хэндла текущей копии приложения указывается хэндл файла, создавшего процесс. Отметим этот момент -хэндл текущей копии приложения представляет собой ни что иное, как хэндл файла, создавшего процесс. Второй аргумент – хэндл предыдущей копии приложения – естественно, равен NULL, так как Win32 для каждого процесса выделяет свое собственное адресное пространство. Третий аргумент-указатель на командную строку – он только что был сформирован. И наконец, четвертый аргумент-флаги, определяющие, каким образом необходимо отображать окно.
Функция WinMain() осуществляет вызов другой функции, JWinMain(), исходный код которой находится в файле appmodul.cpp:
extern "С" int WIUAPI
_tWinMain(HINSTANCE hlnstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
// call shared/exported WinMain return AfxWinMain(hlnstance,
hPrevInstance,
lpCmdLine,
nCmdShow) ;
}
А эта функция, в свою очередь, приведет нас к функции AfxWinMain(), чей исходный код находится в файле winmain.cpp:
int AFXAPI AfxWinMain(HINSTANCE hlnstance,
HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL); int nReturnCode = -1;
CWinThread* pThread = AfxGetThread(); CWinApp* pApp = AfxGetAppO;
// AFX internal initialization if (!AfxWinInit(hlnstance, 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) {
TRACEO("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;
Похожие статьи: CWinApp
