Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在MFC中,WinMain函数如何查找用户应用程序对象';s地址值?_C++_Mfc - Fatal编程技术网

C++ 在MFC中,WinMain函数如何查找用户应用程序对象';s地址值?

C++ 在MFC中,WinMain函数如何查找用户应用程序对象';s地址值?,c++,mfc,C++,Mfc,您好,我是MFC领域的新手 我有一个关于启动MFC应用程序的过程的问题 我了解到,与SDK程序不同,我不必编写WinMain。因为它由类库提供,并在应用程序启动时调用* (参见此处的参考资料:) 我好奇的是:*然后CWinApp调用应用程序对象的成员函数来初始化和运行应用程序 这句话表示CWinApp已经知道由程序员生成的应用程序对象的地址值 然而,即使应用程序对象被定义为全局变量,WinMain函数如何找到应用程序对象的地址值 我在示例MFC代码中找不到任何将地址值带到WinMain函数的连接

您好,我是MFC领域的新手

我有一个关于启动MFC应用程序的过程的问题

我了解到,与SDK程序不同,我不必编写WinMain。因为它由类库提供,并在应用程序启动时调用* (参见此处的参考资料:)

我好奇的是:*然后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()
#包括
类别CHelloApp:公共CWinApp
{
公众:
虚拟BOOL InitInstance();
};
类别名称:公共框架
{
公众:
CMainFrame();
受保护的:
afx_msg void OnPaint();
afx_msg void only buttondown(UINT nFlags,CPoint point);
声明消息映射()
};
切洛亚普;
BOOL CHelloApp::InitInstance()
{
m_pMainWnd=新的CMInframe;
m_pMainWnd->ShowWindow(m_nCmdShow);
返回TRUE;
}
CMainFrame::CMainFrame()
{
创建(空,“HelloMFC应用程序”);
}
开始消息映射(CMInframe、CFrameWnd)
关于油漆
关于WM_LBUTTONDOWN()
结束消息映射()

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

CRT提供一个功能
mainCRTStartup
。此函数是程序启动时调用的入口点
mainCRTStartup
调用
\uu tmainCRTStartup
。此函数首先调用
\u initterm
来调用所有全局对象的构造函数,比如
CWinApp theApp
。该构造函数还调用
CWinApp::CWinApp
,它将
指针存储在全局状态变量中。完成后,
\uu tmainCRTStartup
调用
WinMain
哪个调用
AfxWinMain
AfxWinMain
正在从全局状态变量读取指向
CWinApp theApp
的指针,并调用
CWinApp
的虚拟成员函数

这只是因为

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

    • MFC知道CWinApp,InitInstance()函数是虚拟的,这是有充分理由的。appmodul.cpp实现了
      \u tWinMain
      ,它只调用
      AfxWinMain
      (在winmain.cpp中定义)。指向全局
      CWinApp
      -派生对象的指针存储在进程本地存储中,可以从调用的任何位置访问。谢谢,但现在我想知道AfxGetApp函数是如何工作的。用谷歌搜索该函数让我更加困惑……您有
      AfxGetApp()
      (请参阅afxstate.cpp)的完整源代码。将MFC项目的解决方案加载到VisualStudio中时,浏览MFC代码是最简单的。您将获得语法突出显示和导航辅助(“转到定义…”等)。首先,学习缩进代码。