Visual Studio 2022的MFC框架——AfxWinMain全局对象和InitInstance函数

这篇具有很好参考价值的文章主要介绍了Visual Studio 2022的MFC框架——AfxWinMain全局对象和InitInstance函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Visual Studio 2022的MFC框架——AfxWinMain全局对象和InitInstance函数,Visual Studio技术,visual studio,microsoft,windows,mfc,c++

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Visual Studio 2022下开发工具的MFC框架知识。 

在看这篇帖子前,请先看我的另一篇帖子《Visual Studio 2022的MFC框架——应用程序向导》。

当程序调用了CWinApp类的构造函数,并执行了CMfcApp类的构造函数,且产生了theApp 对象之后,接下来就进入 WinMain 函数。根据前面我写的一些MFC帖子所示的代码,可以发现WinMain 函数实际上是通过调用 AfxWinMain函数来完成它的功能的。

Afx前缀的函数代表应用程序框架Application Framework函数。应用程序框架实际上是一套辅助我们生成应用程序的框架模型。该模型把多个类进行了一个有机的集成,可以根据该模型提供的方案来设计我们自己的应用程序。在MFC中,以Afx为前缀的函数都是全局函数,可以在程序的任何地方调用它们。

我们可以采取同样的方式查找定义AfxWinMain 函数的源文件,在搜索到的文件中双击winmain.cpp,并在其中找到 AfxWinMain函数的定义代码。

int AFXAPI AfxWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
        _In_ LPTSTR lpCmdLine, int nCmdShow)
{
  ASSERT (hPrevInstance == NULL);

  int nReturnCode =-1;

  CWinThread* pThread = AfxGetThread();
  CWinApp* pApp AfxGetApp();

  // AFX internal initialization
  if ( !AfxWinInit (hInstance, hPrevInstance, lpCmdLine, nCmdShow))
      goto InitFailure;

  // App global initializations (rare)
  if (pApp != NULL && !pApp->InitApplication())
     goto InitFailure;

   // Perform specific initializations
  if (!pThread->InitInstance())
   {
     if (pThread->m_pMainWnd != NULL)
      {
        TRACE(traceAppMsg, 0, "Warning\n");
        pThread->m_pMainWnd->Destroywindow();
      }
    nReturnCode = pThread->ExitInstance();
    goto InitFailure;
 
  nReturnCode = pThread->Run();

  InitFailure:
  #ifdef _DEBUG
     // Check for missing AfxLockTempMap calls
     if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
      {
        TRACE(traceAppMsg, 0, "Warning\n", 
       AfxGetModuleThreadState ()->m_nTempMapLock);
      }
     AfxLockTempMaps ();
     AfxUnlockTempMaps (-1);
  #endif

  AfxWinTerm();
  return nReturnCode;
  }

在上面所示的代码中,AfxWinMain首先调用AfxGetThread函数获得一个CWinThread类型的指针,接着调用 AfxGetApp函数获得一个CWinApp类型的指针。从MFC类库组织结构图中可以知道CWinApp派生于CWinThread。

下面是AfxGetThread函数的源代码,位于thrdcore.cpp文件中。

CWinThread* AFXAPI AfxGetThread()
{
  // check for current thread in module thread state

   AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState ();
   CWinThread* pThread = pState->m_pCurrentWinThread;
  return pThread;
}

从上面所示代码中可以发现, AfxGetThread函数返回的就是在 CWinApp构造函数中保存的 this指针。对Mfc程序来说,这个this指针实际上指向的是CMfcApp的全局对象:theApp。

AfxGetApp是一个全局函数,定义于 afxwin1.inl中:

_AFXWIN_INLINE CWinApp* AFXAPI AfxGetApp()

   { return afxCurrentWinApp;}

而afxCurrentWinApp的定义位于 afxwin.h文件中,代码如下:

#define afxCurrentWinApp    AfxGetModuleState()->m_pCurrentWinApp

结合查看之前关于MFC帖子中所示的CWinApp构造函数代码,就可以知道 AfxGetApp函数返回的是在 CWinApp 构造函数中保存的 this 指针。对Mfc程序来说, 这个 this 指针实际上指向的是 CMfcApp的对象: theApp。也就是说,对Mfc程序来说, pThread和 pApp所指向的都是CMfcApp类的对象,即theApp全对象。

再来说说InitInstance函数,再回到上面所示的 AfxWinMain函数,可以看到在接下来的代码中,pThread和 pApp调用了三个函数,这三个函数就完成了Win32程序所需要的几个步骤:设计窗口类、注册窗口类、创建窗口、显示窗口、更新窗口、消息循环,以及窗口过程函数。pApp首先调用 InitApplication函数,该函数完成MFC内部管理方面的工作。

接着,调用pThread的 InitInstance 函数。在Mfc程序中,可以发现从 CWinApp派生的应用程序类CMfcApp也有一个InitInstance函数,其声明代码如下所示。

virtual BOOL InitInstance();

从其定义可以知道,InitInstance函数是一个虚函数。根据类的多态性原理,可以知道AfxWinMain函数在这里调用的实际上是子类  CMfcApp 的 InitInstance函数。CMfcApp类的 InitInstance函数定义代码如下所示。

BOOL CMfcApp::InitInstance()
{
  INITCOMMONCONTROLSEX InitCtrls;
  InitCtrls. dwsize sizeof (InitCtrls);

  //将它设置为包括所有要在应用程序中使用的
  //公共控件类

  InitCtrls. dwICC = ICC_WIN95_CLASSES;
  InitCommonControlsEx(&InitCtrls);

  CWinApp::InitInstance();

  //初始化OLE库
  if (!AfxOleInit())
  {
     AfxMessageBox (IDP_OLE_INIT_FAILED);
      return FALSE;
    }

  AfxEnableControlContainer();

  EnableTaskbarInteraction (FALSE);

  SetRegistryKey(_T("应用程序向导生成的本地应用程序")
    LoadStdProfileSettings(4); //加载标准 INI 文件选项(包括 MRU)

    //注册应用程序的文档模板。  文档模板
  //将用作文档、框架窗口和视图之间的连接

  CSingleDocTemplate* pDocTemplate;

  pDocTemplate = new CSingleDocTemplate(
  IDR_MAINFRAME,
    RUNTIME_CLASS (CMfcDoc),
    RUNTIME_CLASS (CMainFrame),  //主SDI框架窗口
    RUNTIME_CLASS (CMfcView));
  if ( !pDocTemplate)
     return FALSE;
  AddDocTemplate (pDocTemplate);

  //分析标准shel1命令、DDE、打开文件操作的命令行
    CCommandLineInfo cmdInfo;
  ParseCommandLine (cmdInfo);

 
  if ( !ProcessShellCommand (cmdInfo))
     return FALSE;
  
   //唯一的一个窗口已初始化,因此显示它并对其进行更新
    m_pMainWnd->ShowWindow(SW_SHOW);
  m_pMainWnd->Updatewindow ();
  return TRUE;
}

这几篇内容涉及的内容有点难,如果大家看不懂,要结合其他VC的资料综合看。

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。文章来源地址https://www.toymoban.com/news/detail-684589.html

到了这里,关于Visual Studio 2022的MFC框架——AfxWinMain全局对象和InitInstance函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Microsoft Visual Studio 2022添加.NET Framework 4.6.2框架,然后说下.NET目标包的作用。

    众所周知,Microsoft Visual Studio 2022不再支持.NET Framework 4.6以下的框架。从而导致前期使用老框架开发的某些应用无法打开(打开时提示安装框架,但又安装不成功)的情况出现。  前于如何安装.NET Framework 4.5及更早版本框架的方法,网上很多,甚至搜索4.6相关,出来的结

    2024年02月17日
    浏览(59)
  • 解决Unity游戏开发使用Visual Studio Enterprise 2022提示未找到目标框架.net framework4.7.1问题

    采用Visual Studio Installer安装Visual Studio Enterprise 2022,安装中勾选游戏下Unity游戏开发。 单个组件中确保勾选.NET Framework 4.7.1目标包 安装位置自定义修改至F盘后使用Visual Studio Enterprise 2022登录,在Unity设置使用Visual Studio Enterprise 2022并打开对应项目文件,提示未找到目标框架.net

    2024年02月10日
    浏览(60)
  • 【visual studio】visual studio 2022 无法 复制黏贴

    其他网友也有反馈到微软: VS 2022 Copy and Paste form feature Broken? Copy paste still not fixed in Visual studio 2022 表现是突然就无法复制和黏贴了 其他的app 就没有这个问题 每次都是重启电脑解决。 今天,11月29号是17.41版本了。 -net5.0直接卸载了

    2024年02月04日
    浏览(99)
  • visual studio 2022配置

    前提:我linux c 开发 一直在使用vscode 更新了个版本突然代码中的查找所用引用和变量修改名称不能用了,尝试了重新配置clang vc都不行,估计是插件问题,一怒之下改用visual studio 2022 为了同步2个IDE之间的差别,目前看着差不多,我在用用,有啥区别在进行修改 1、使用///添加

    2024年02月12日
    浏览(49)
  • Visual Studio下载(2022)

    1.搜索微软官网  2.点击微软官网,并点击右上角的 所有Microsoft    3.出现如上界面,点击开发人员中心    4.出现如上界面 ,往下滑动 5.点击Visual Studio  6,点击下载Visual Studio旁边的右下箭头。   7。点击Community2022(此为免费的社区版)   8.下载以后打开文件 9.点击继续 10,下

    2024年02月10日
    浏览(41)
  • Visual Studio 2022 更换主题

    🏆 个人愚见,没事写写笔记 🏆《博客内容》:Unity3D开发内容 🏆🎉欢迎 👍点赞✍评论⭐收藏 🔎目标:Visual Studio 2022想换个皮肤 ☀️实现目标: 准备工作:完成Visual Studio 2022 安装。 1.打开Visual Studio 2022第一步:  2.在弹出的浏览器中选择喜欢的主题下载:  3.找到下载好

    2024年02月12日
    浏览(49)
  • Visual Studio 2022 的下载

            子曰:“工欲善其事,必先利其器。”要做好一件事,准备工具非常重要。本文将带领 大家下载Microsoft Visual Studio Community 2022 。         1、到网上搜索Visual Studio 2022。网址: Visual Studio: IDE and Code Editor for Software Developers and Teams Visual Studio dev tools services make app deve

    2024年02月08日
    浏览(88)
  • 免费安装Visual Studio 2022

    我使用软件的选择顺序是优先选择开源软件,其次是社区免费版本,大部分时间我都是在linux下开发,很少在windows下写代码。但是在这microsoft还是处于统治地位的时代,而且很多新手写代码开始还是倾向于在windows下,因此推荐Visual Studio 2022 社区版,即满足我的个人选择倾向

    2024年02月11日
    浏览(56)
  • Unity + Visual Studio 2022

    安裝Visual Studio 2022的时候,需要勾选“使用Unity进行游戏开发”    Unity 中 Preference - External Tools - External Script Editor,要选择 Visual Studio 2022    开启后,使用VS开启Unity 项目后,我这里会提示“项目不相容”。检查是因为我之前使用Visual Studio 2017开启过这个项目,项目文件跟

    2024年02月12日
    浏览(50)
  • Microsoft Visual studio 2022 如何自定义背景(详细) Visual studio 2022 怎么改背景和幻灯片播放(自定义背景)

    1.新建一个项目,项目名称无所谓 进入编辑页面后,点击拓展管理拓展联机 右边搜索框搜索 ClaudiaIDE, 键入后点击回车搜索,然后点击下载,等待下载完成,(这里下载进度条一直不动的话可能是网络不好的原因,我这里已经安装好了) 下载完成后,关闭visual studio 2022,桌

    2024年02月06日
    浏览(91)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包