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

来源:互联网 发布:nginx内置变量详解 编辑:程序博客网 时间:2024/05/16 05:52

碰到一个问题,在不同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

时隔多天,又遇见这个问题,还是跨dll调用对话框出问题,特地回来看看博客,之前一直不理解的也突然理解了。

说白了,MFC调用的都是主程序的资源模块,而对话框资源是保存在自己的dll下面的,在主程序的资源文件里是看不到的,所以MFC提供了一个开关,来得到正确的句柄。


PS:如果想在别的类中包含自己新添加的对话框类,则需要把应用程序的主头文件加上,否则会出现 IDD_DIALOG未命名的情况,原因是没有添加#include "Resource.h"

1 0
原创粉丝点击