关于MFC中Winmain函数的跟踪

今天闲来无事,想自己用断点追踪下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程序的入口。唉,这个问题真的困扰了我很多天-_-!现在才完全想明白……

你可能感兴趣的:(VC++/MFC)