今天闲来无事,想自己用断点追踪下MFC框架怎么把Winmain入口函数封装起来的,首先应该知道在MFC中Winmain函数是在平台SDK的某个头文件中已经定义好的,并且它是通过AfxWinMain函数调用的,以下是跟踪过程:
1.先用F9设置2个断点:
第一个断点设置在你自己命名的文件名类的构造函数处(我这里用Test,所以就是CTestApp):
CTESTApp::CTESTApp()
//断点1
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/
// The one and only CTESTApp object
CTESTApp theApp;
第二个断点设置在Winmain.cpp(这个文件在MFC/SRC中自己找,里面就是AfxWinMain函数)的第48行判断语句处:
// Perform specific initializations
//断点2
if (!pThread->InitInstance())//这里用来判断线程是否创建成功
{
if (pThread->m_pMainWnd != NULL)
{
TRACE0("Warning: Destroying non-NULL m_pMainWnd/n");
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
2.设置好断点后用F5编辑运行,发现程序先执行到TheApp实例化对象,然后调用对象的构造函数CTestApp,分配内存空间,最后通过调用AfxWinMain函数进入Winmain函数。
因此,整个过程总结起来就是……
theApp对象初始化->调用类名构造函数分配内存空间->调用AfxWinMain函数->调用CwinApp类的成员函数完成各种初始化(包括InitApplication 、InitInstance 、Run(包含消息循环))->Winmain函数执行。
PS:解释一下,有人可能会问,为什么编译器不直接调用Winmain函数,而要用AfxWinMain函数调用Winmain函数呢,这是因为以Afx命名的函数都是全局函数,可以供整个平台调用,而Winmain则不行。再者,在AfxWinMain函数中可以对整个MFC框架进行多个成员函数的初始化(包括消息循环机制),最后还可以通过AfxWinMain将值返回给Winmain函数,从而获得windows程序的入口。唉,这个问题真的困扰了我很多天-_-!现在才完全想明白……