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

Posted

技术标签:

【中文标题】在 MFC 中,WinMain 函数如何找到用户应用程序对象的地址值?【英文标题】:In MFC, how can WinMain function find user application object's address value? 【发布时间】:2016-03-20 14:17:44 【问题描述】:

您好,我是 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()

【问题讨论】:

MFC 知道 CWinApp,InitInstance() 函数是虚函数是有充分理由的。 appmodul.cpp 实现了_tWinMain,它只是调用AfxWinMain(在winmain.cpp 中定义)。指向全局CWinApp派生对象的指针存储在进程本地存储中,并且可以从任何调用AfxGetApp的地方访问。 谢谢,但现在我想知道 AfxGetApp 函数是如何工作的。谷歌搜索该功能让我更加困惑...... 您拥有AfxGetApp() 的完整源代码(参见afxstate.cpp)。将 MFC 项目的解决方案加载到 Visual Studio 时,浏览 MFC 代码是最容易的。您可以获得语法突出显示和导航帮助(“转到定义...” 等)。 首先,学会缩进你的代码。 【参考方案1】:

很好的问题,但您可以在调试器下运行 exe、在正确的位置设置断点并单步执行 MFC 源代码时自己回答。

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

这只是因为......

构造函数存储了this指针 只存在一个CWinApp 对象 CWinApp 用作接口,因此 MFC 不需要知道您的 CWinApp 派生类到底是什么样子

【讨论】:

以上是关于在 MFC 中,WinMain 函数如何找到用户应用程序对象的地址值?的主要内容,如果未能解决你的问题,请参考以下文章

MFC6.0建立一个文档视图框架时,怎么找不到入口WinMain()函数

MFC程序执行过程剖析(转)

VC中MFC从哪里开始运行,MFC怎么调试,很急呀

VC中MFC从哪里开始运行,MFC怎么调试

为啥mfc中从InitInstance()中进入程序

(转)InitInstance函数的理解