MFC不同dll中对话框的调用问题

本文探讨了在MFC不同dll中调用对话框遇到的问题,主要表现为 OnInitDialog() 时系统崩溃。解决方案包括理解并利用 MFC 的 Process State、Thread State 和 Module State,以及使用 AFX_MANAGE_STATE 宏来正确切换模块状态,确保对话框资源的正确加载。作者在后续中提及,MFC 默认使用主程序资源模块,而DLL中的对话框资源需通过开关模块状态访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

碰到一个问题,在不同dll中对话框的调用一直报错,调试发现在OnInitDialog()的时候系统死掉,网上一查才知道还是MFC了解的太少。

网上提供了2种方法,一是将DLL编译成静态链接,即通过更改项目属性-配置属性-常规-MFC的使用中更改,这个我直接pass了,因为我觉得都是本机测试,不会是因为这个

问题,第二种方法是在定义对话框之前加上:

AFX_MANAGE_STATE(AfxGetStaticModuleState())

AFX_MANAGE_STATE字面理解就是管理某种状态,而括号里的就是获取某种静态的模块状态,在MFC中,States用来保存某种相关的状态信息,例如:

1:Process State 和某个单独的进程绑定起来

2:Thread State 和某个单独的线程绑定

3: Module State 和Module相关

前两种State和一般的全局变量十分类似, 只是根据需求的不同被绑定于不同的进程或者线程,如多线程支持等。而Module State本身比较特别,Module State根据情况的不同,可以是全局 、线程、或者进程相关的State,并且可以根据要求快速切换。

百度百科上定义说调用AFX_MANAGE_STATE(AfxGetStaticModuleState());是用来设置先前初始化和/或回复先前清理后的模块状态。默认情况下,MFC使用资源处理的主要应用程序加载资源模块,比如启动另一个DLL中的对话框,这个模块实际上是存储在dll中的,这就需要开关模块状态来正确使用它。

20170408</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值