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的功能。


posted @ 2011-09-19 23:59  独酌逸醉  阅读(2360)  评论(0编辑  收藏  举报