AFX_MANAGE_STATE

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

 

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这个结构体又是什么呢? 从字面上看,是模块线程状态,理解起来从字面看不出啥意思,个人觉得命名命的不

MFC的模块状态:从AfxGetApp()和AFX_MANAGE_STATE()看MFC的模块状态 1.      Introduction当我们在用MFC编程的时候,我们经常用到AfxGetApp()来获得当前的CWinApp的Instance。看看MFC的源代码中AfxGetApp()的实现,你会发现AfxGetApp()的实现并不像一般情况下面那样直接: _AFXWIN_INLINE CWin 阅读详情

相关推荐

AFX_MANAGE_STATE(AfxGetStaticModuleState());问题

  写一个MFC规则动态链接库(regularDll.dll),在这个里面写一个函数 extern "C " _declspec(dllexport) void ShowDlg(void) { CMyDlg dlg; dlg.DoModal(); AfxMessageBox( "hello "); } 建立一个基于对话框的应用程序CallDll,添加一个按钮,在OnBtn1(){}里调用

JidanIt的专栏 1528

正确使用AFX_MANAGE_STATE宏管理MFC模块状态, AFX_MANAGE_STATE宏作用,真的很重要!!!

DLL 中使用 MFC 时,每个线程都需要正确的 MFC 模块状态,以确保使用 MFC 功能的正确性。在使用 MFC(Microsoft Foundation Classes)开发 DLL(动态链接库)时,正确管理 MFC 模块状态是确保功能正常运行的关键。在使用 MFC 开发 DLL 时,正确设置 MFC 模块状态是确保功能正常运行的基本步骤。宏是 MFC 提供的用于设置线程的 MFC 模块状态的工具。宏的重要性,以及在 DLL 中正确设置 MFC 模块状态的步骤。在 DLL 中的导出函数中,使用。

qq_44859843的博客 1541

AFX_MANAGE_STATE(AfxGetStaticModuleState())

以前写MFCDLL的时候,总会在自动生成的代码框架里看到提示,需要在每一个输出的函数开始添加上AFX_MANAGE_STATE (AfxGetStaticModuleState())。一直不明白这样做的含义,也一直没有这样做,而且代码也工作得好好的,所以感觉这好像一句废话。 最近的项目中,需要在DLL里使用MFC生成界面,这才发现一旦资源放在不同的动态库里,而且还和多线程搅和在一起的时候,事情就...

1610

MFC 模块切换 AFX_MANAGE_STATE(AfxGetStaticModuleState())

模块切换

weixin_45053845的博客 1015

AFX_MANAGE_STATE(AfxGetStaticModuleState()) 作用

AFX_MANAGE_STATE(AfxGetStaticModuleState())  AFX_MANAGE_STATE(AfxGetStaticModuleState());//用于模块切换时的状态保护, 1.AfxGetStaticModuleState()指向当前模块状态; 2.当前函数调用结束后原模块的状态自动被恢复; 3.用于DLL中所调用MFC函数、类、资

b2292486308的博客 7202

AFX_MANAGE_STATE(AfxGetStaticModuleState())说起

以前写MFCDLL的时候,总会在自动生成的代码框架里看到提示,需要在每一个输出的函数开始添加上AFX_MANAGE_STATE(AfxGetStaticModuleState())。一直不明白这样做的含义,也一直没有这样做,而且代码也工作得好好的,所以感觉这好像一句废话。最近的项目中,需要在DLL里使用MFC生成界面,这才发现一旦资源放在不同的动态库里,而且还和多线程搅和在一起的时候,事情就变得

optman的专栏 2万+

AFX_MANAGE_STATE 宏说明

AFX_MANAGE_STATE是一个宏,其原型为: AFX_MANAGE_STATE( AFX_MODULE_STATE* pModuleState )   该宏用于将pModuleState设置为当前的有效模块状态。当离开该宏的作用域时(也就离开了pModuleState所指向栈上对象的作用域),先前的模块状态将由AFX_MODULE_STATE的析构函数恢复。   方法二 在D

laihuan99的专栏 2498

AFX_MANAGE_STATE(AfxGetStaticModuleState())的使用

[MSDN] By default, MFC uses the resource handle of the main application to load the resource template. If you have an exported function in a DLL, such as one that launches a dialog box in the DLL, th...

sinat_31608641的博客 2224

关于AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

动态链接到MFC的规则DLL应用程序里头的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。但是,所有从DLL输出的函数应该以如下语句开始:AFX_MANAGE_STATE(AfxGetStaticModuleState()) 此语句用来正确地切换MFC模块状态。------------------------------------------------------

eva1988725的专栏 1006

MFC的资源切换AFX_MANAGE_STATE

转自:http://www.cnblogs.com/ntrgx/archive/2010/11/14/1877199.html 如何实现DLL资源切换的?AFX_MANAGE_STATE(AfxGetStaticModuleState())这就是他们的答案,一如微软的推荐,原来就是这么简单啊!让我们来看看,这句代码到底做了什么? #define AFX_MANAGE_STATE

My Blog 936

C++ AFX_MANAGE_STATE(AfxGetStaticModuleState())的作用

https://www.cnblogs.com/linlf03/archive/2011/11/16/2251318.html 从AFX_MANAGE_STATE(AfxGetStaticModuleState())说起https://blog.csdn.net/optman/article/details/332277 AFX_MANAGE_STATE(AfxGetStaticM...

freeking101的博客 572

探秘 MFC 中的 AFX_MANAGE_STATE:确保模块资源管理井然有序

在 Windows 程序开发的世界里,尤其是涉及到 MFC(Microsoft Foundation Classes)时,有一个看似不起眼却起着关键作用的宏——AFX_MANAGE_STATE。今天,就让我们深入了解一下它的奥秘。

波波诸葛伟 1238
上一篇: WM_DESTROY & WM_NCDESTROY
下一篇: perils of javaschool
deppcyan
博客等级 码龄19年 18粉丝 55原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值