AFX_MANAGE_STATE

 

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这个结构体又是什么呢? 从字面上看,是模块线程状态,理解起来从字面看不

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值