VS2005中探索MFC运行机制 Dialog,以便更深入掌握MFC。
ntdll.dll 进入
BOOL WINAPI_DllMainCRTStartup()
{
调用了__DllMainCRTStartup()函数
{
调用了_CRT_INIT(hDllHandle, dwReason, lpreserved)
{
调用 _initterm(__xc_a,__xc_z)
{
调用 (**pfbegin)(),
{
构造了CWinApp _afxOleWinApp;对象
}
}
}
调用 WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
调用AfxWinInit(hInstance, NULL, _T(""), 0);
}
}
}
kernel32.dll 进入
mainCRTStartup()
{
调用__tmainCRTStartup()
{
构造全局变量CtestdlgApp theApp;
先进入基类构造CWinApp::CWinApp
运行WinMain即 _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
__in LPTSTR lpCmdLine, int nCmdShow)
{
调用AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow)
{
调用AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow)
调用pApp->InitApplication()
调用pThread->InitInstance() 即CtestdlgApp::InitInstance()
{
构造CtestdlgDlg dlg对象
{
调用CDialog构造
{
调用CWnd构造
{
}
}
}
调用 dlg.DoModal()
{
调用CreateDlgIndirect(lpDialogTemplate,
CWnd::FromHandle(hWndParent), hInst)
{
调用AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG)注册窗口类
调用::CreateDialogIndirect(hInst, lpDialogTemplate,
pParentWnd->GetSafeHwnd(), AfxDlgProc)创建窗口
}
调用RunModalLoop(dwFlags) 进入消息循环
}
}
}
}
}
}