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) 进入消息循环
}
}
}
}
}
}
本文详细解析了Visual Studio 2005中MFC的应用程序启动流程,从ntdll.dll和kernel32.dll的入口函数开始,逐步介绍了CWinApp和CDialog等关键类的初始化过程及对话框的创建与消息循环。
2232

被折叠的 条评论
为什么被折叠?



