MFC对于跨模块之间的调用破费心机,设计了一条STATE机制.而且设计的颇为麻烦.费了老鼻子劲终于探究了一二而已.
转一篇分析的比较好的文章.
http://hi.baidu.com/rootlife/blog/item/2f37e354ad8cdc5bd10906be.html
这里补充几点:
1._afxthreadstate 是全局的,至于每个线程中维护一个_afxthreadstate变量,还是进程中维护一个_afxthreadstate变量.这个有待验证.
2. 每个模块会维护一个模块状态.如果是动态链接库的话,模块状态的定义在dllmodule.cpp中,static _AFX_DLL_MODULE_STATE afxModuleState;如果是可执行文件的话,模块状态的定义在afxstate.cpp中,PROCESS_LOCAL(_AFX_BASE_MODULE_STATE, _afxBaseModuleState)可以看到是进程唯一的.
3. AfxGetModuleThreadState(),去当前模块状态中的m_thread.可以看一下源代码是
AFX_MODULE_THREAD_STATE* AFXAPI AfxGetModuleThreadState()
{
AFX_MODULE_THREAD_STATE* pResult=AfxGetModuleState()->m_thread.GetData();
ENSURE(pResult != NULL);
return pResult;
}
而AfxGetModuleState()的源代码
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;
}
一般是取当前模块的模块状态,如果模块状态为空的话,就取可执行文件的模块状态.一般情况下当前模块的状态是NULL的.也就是说一般取的都是可执行文件的模块状态.
4. AFX_MODULE_THREAD_STATE这个结构体又是什么呢? 从字面上看,是模块线程状态,理解起来从字面看不