gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:11 24 4
gpt4 key购买 nike

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

最佳答案

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

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

这只是因为......

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

关于c++ - 在MFC中,WinMain函数如何找到用户应用程序对象的地址值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36114851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com