MFC程序运行原理初探
2024-10-21 15:31:58
几年前,写过一段时间的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()来接受界面上的消息进行相应的处理。
最新文章
- 【MVC拾遗】MVC的单元测试简单学习总结
- 【BZOJ】1436: Poi2003 Trinomial
- BZOJ2594: [Wc2006]水管局长数据加强版
- C# C/S 结构操作Ini系统文件
- (2)java堆内存
- Master Nginx(3) - Using the Mail Module
- Python按行读文件对比
- 一段从TXT导入excel的py脚本
- xBIM WeXplorer xViewer 基本应用
- 你真的了解word-wrap和word-break的区别吗?
- Problem A: Apple(高斯消元)
- vue请求java服务端并返回数据
- python性能分析之cProfile模块
- WinRAR 5.40 &; 4.20 &; 3.93 的注册码 - rarreg.key
- 取n到m行
- 20155210 实验一 逆向与Bof基础
- List,Set的区别
- 【本周主题】第一期:JavaScript单线程与异步
- Java调用存储过程小结
- 掉电脉冲映射串口log和dmesg到文件中的log