MFC 程序来龙去脉_子文档1
MFC 程序来龙去脉_子文档 1
探究CWinThread* pThread = AfxGetThread(); 和 CWinApp* pApp = AfxGetApp()
查看 AfxGetThread() 源码(C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\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;
}
继续查看 AfxGetModuleThreadState 源码(C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\afxstate.cpp):
AFX_MODULE_THREAD_STATE* AFXAPI AfxGetModuleThreadState()
{
AFX_MODULE_THREAD_STATE* pResult=AfxGetModuleState()->m_thread.GetData();
ENSURE(pResult != NULL);
return pResult;
}
继续查看 AfxGetModuleState() 源码(C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\afxstate.cpp):
AFX_MODULE_STATE* AFXAPI AfxGetModuleState()
{
_AFX_THREAD_STATE* pState = _afxThreadState;
ENSURE(pState);
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();
}
ENSURE(pResult != NULL);
return pResult;
}
没找到 _afxThreadState 的定义,网上的解释是:
(1)这是一个MFC定义的保存线程句柄信息的结构
(2)_afxThreadState是一个全局的对象。通过该对象可以获得_AFX_THREAD_STATE对象,后者是线程相关的。
(3)AfxGetModuleState()可以获得与执行线程关联的AFX_MODULE_STATE,而 AfxGetModuleThreadState() 可以获得与执行线程关联的AFX_MODULE_STATE与当前执行线程关联的AFX_MODULE_THREAD_STATE。
退一步,我们直接查 AfxGetThread() 的功能:
“AfxGetThread()返回的是当前界面线程对象的指针,AfxGetApp()返回的是应用程序对象的指针,如果该应用程序(或进程)只有一个界面线程在运行,那么这两者返回的都是一个全局的应用程序对象指针,这个全局的应用程序对象就是MFC应用框架所默认的theApp对象”
AfxGetApp 源码已不必看,上面这段话已经很好的解释了 AfxGetApp的功能。