几年前,写过一段时间的MFC,但是只知其然不知其所以然,最近闲来无事,研究了一下MFC程序的运行顺序,特此记录一下。

首先,如果我们创建一个MFC程序的话,首先会自动生成一个CWinApp的子类,程序运行时,最先执行的就是该子类的构造函数。

然后,会由连接器调用函数内自动连接的函数AfxWinMain,这个函数在文件winmain.cpp中实现,这也可以被作为整个MFC程序的入口函数,其代码如下:

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: Destroying non-NULL m_pMainWnd\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: Temp map lock count non-zero (%ld).\n",
AfxGetModuleThreadState()->m_nTempMapLock);
}
AfxLockTempMaps();
AfxUnlockTempMaps(-1);
#endif AfxWinTerm();
return nReturnCode;
}

函数执行时,先通过AfxGetThread()和AfxGetApp()获取两个指针对象,这两个函数前者是获取当前运行的线程对象,后者是获取当前运行的APP对象,细心的话,可以发现CWinApp是继承自CWinThread类的,所以如果是单线程的应用的话,两者返回的应该是同一个对象指针,而这个对象正是我们前面所提到的CWinApp的子类。

于是一切都顺理成章了,首先调用InitApplication()函数,然后调用InitInstance()函数,最后调用Run()来接受界面上的消息进行相应的处理。

最新文章

  1. 【MVC拾遗】MVC的单元测试简单学习总结
  2. 【BZOJ】1436: Poi2003 Trinomial
  3. BZOJ2594: [Wc2006]水管局长数据加强版
  4. C# C/S 结构操作Ini系统文件
  5. (2)java堆内存
  6. Master Nginx(3) - Using the Mail Module
  7. Python按行读文件对比
  8. 一段从TXT导入excel的py脚本
  9. xBIM WeXplorer xViewer 基本应用
  10. 你真的了解word-wrap和word-break的区别吗?
  11. Problem A: Apple(高斯消元)
  12. vue请求java服务端并返回数据
  13. python性能分析之cProfile模块
  14. WinRAR 5.40 & 4.20 & 3.93 的注册码 - rarreg.key
  15. 取n到m行
  16. 20155210 实验一 逆向与Bof基础
  17. List,Set的区别
  18. 【本周主题】第一期:JavaScript单线程与异步
  19. Java调用存储过程小结
  20. 掉电脉冲映射串口log和dmesg到文件中的log

热门文章

  1. R包本地安装方法
  2. 02_IntelliJ IDEA常用快捷键
  3. Git命令学习总结(廖雪峰官方Git教程)
  4. 【QT】创建动态链接库及使用
  5. pytorch自定义RNN结构(附代码)
  6. (原创)odoo15(master)下,列表导出权限控制
  7. idea远程连接云服务器,并将本地代码部署在云端进行运算
  8. js处理url插件库query-string
  9. h5 json 生成excel
  10. sdio 移植st官方例程 stm32f103