Программирование на языке 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;

Похожие статьи: