在MFC中,WinMain函数如何查找用户应用程序对象的地址值?

时间:2016-03-20 14:17:44

标签: c++ mfc

问候,我是MFC领域的新手。

我对启动MFC应用程序的过程有疑问。

我了解到与SDK程序不同,我不必编写 WinMain 。因为它由类库提供,并在应用程序启动时调用。* (参见此处的参考:https://msdn.microsoft.com/en-us/library/akdx0603.aspx

我的好奇之处在于:*然后CWinApp调用应用程序对象的成员函数来初始化并运行应用程序。

该句子表明CWinApp已经知道程序员做出的应用程序对象的地址值。

但是,即使应用程序对象被定义为全局变量,WinMain函数如何找到应用程序对象的地址值?

我在示例MFC代码中找不到任何连接或声明,它为WinMain函数带来了地址值。

#include <afxwin.h>

class CHelloApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};

class CMainFrame : public CFrameWnd
{
public:
CMainFrame();
protected:
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
};
CHelloApp theApp;

BOOL CHelloApp::InitInstance()
{
m_pMainWnd = new CMainFrame;
m_pMainWnd->ShowWindow(m_nCmdShow);
return TRUE;
}

CMainFrame::CMainFrame()
{
Create(NULL, "HelloMFC Application");
}


BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

1 个答案:

答案 0 :(得分:0)

很好的问题,但是你可以在调试器下运行你的exe,在正确的位置设置断点并进入MFC源代码时自己回答。

CRT提供了一个函数mainCRTStartup。此函数是程序启动时调用的入口点。 mainCRTStartup来电__tmainCRTStartup。此函数首先调用_initterm来调用所有全局对象的构造函数 - 比如CWinApp theApp。该构造函数还调用CWinApp::CWinApp,它将this指针存储在全局状态变量中。完成后__tmainCRTStartup调用WinMain调用AfxWinMainAfxWinMain正在从全局状态变量中读出指向CWinApp theApp的指针,并调用CWinApp的虚拟成员函数。

这只能起作用,因为......

  • 构造函数存储了this指针
  • 只存在一个CWinApp对象
  • CWinApp用作接口,因此MFC不需要知道您的CWinApp派生类的确切位置