MFC做到了从C/SDK开发Win32程序到利用OOP思想开发Win32程序的过渡,它的封装完美体现的C++的三大特性,提高了Win32程序的开发效率,但它的封装也使得本来清晰的脉络,变得晦涩起来。
今天我们探究被微软冠以Afx前缀的全局函数AfxGetApp(),这个函数作用是获取当前应用进程的指针,确切的说是获取由CWinApp派生出类的对象,相信懂MFC的人都熟知,但作为全局函数的它是如何在基类获取的派生类对象的?
现在我们开始一步一步揭开AfxGetApp()神秘面纱~
(1)AfxGetApp()
函数的声明在AFXWIN.H,定义在AFXWIN1.INL
_AFXWIN_INLINE CWinApp* AFXAPI AfxGetApp()
{ return afxCurrentWinApp; }
afxCurrentWinApp是一个宏,定义在AFXWIN.H中
#define afxCurrentWinApp AfxGetModuleState()->m_pCurrentWinApp
(2)AfxGetModuleState()
其返回值为AFX_MODULE_STATE类指针,声明在AFXSTAT_.H
AFX_MODULE_STATE* AFXAPI AfxGetModuleState();
定义在AFXSTATE.CPP
AFX_MODULE_STATE* AFXAPI AfxGetModuleState()
{
_AFX_THREAD_STATE* pState = _afxThreadState;
AFX_MODULE_STATE* pResult;
if (pState->m_pModuleState != NULL)
{
// thread state's module state serves as override
pResult = pState->m_pModuleState;
}
else
{
// otherwise, use global app state
pResult = _afxBaseModuleState.GetData();
}
ASSERT(pResult != NULL);
return pResult;
}
AfxGetModuleState函数的定义中,可以看出函数返回的是pState->m_pModuleState或者_afxBaseModuleState.GetData();