MFC扩展DLL导出对话框类

来源:互联网 发布:淘宝客鹊桥计划怎么建 编辑:程序博客网 时间:2024/04/28 16:19

MFC扩展DLL导出对话框类

wls(630771620wls@sina.com

20130114

(此文为作者原创,任何转载须保持文章完整,并提供引用的链接。)

说最近北京的空气差极了,居然有毒。去亚马逊上看了一下,PM2.5防护口罩脱销了,在小屋里宅了两天没跟上时代的发展,看来我只能买防毒面具了。

在网上看了一下,关于“dll导出对话框类”的搜索,基本上都是2个人的帖子,大家各种转载,创建的类一个名字叫CDlgDog,另一个叫GameDlg。纵观天下大事,合久必分分久必合,blablabla……

单击File->New创建新工程,如图。



step 1of 1中选择第三项“MFC Extension DLL(using shared MFC DLL)”选项。点击finish即可。

下面就要给这个Demo添加对话框了。

ResourceView的界面中,你会看到一个叫做“ExDllDlg resources”的文件夹图标。在它上面右键点击,在弹出菜单中点击“Insert”,在弹出的对话框中“Dialog”。因为只是个小Demo,在这里不需要展开那个“+”号,里面详细的选择自个鼓捣去吧。点击“New”即可。如下图。

因为添加了资源,所以在“StdAfx.h”文件中加上“#include "resource.h"”,如图。

由于后续的讲解中会用到这个,所以我把它做成那种无边框的子对话框,这样可以嵌入在别的窗口里。

在对画框上点击右键选择“Properties”选项,在“General”中更改下ID会显得自己更专业,我把它改成“IDD_DLG_WLS_PIC;“在“Styles”中把Style改成“Child,把“Border”改成“None”。如图。


这时,对话框会变成这个样子,这就是我们想要的样子。

下面,你可以自己给对话框添加其他的什么奇葩控件都可以,改成你想要的样子吧。我把它改成这个样子。

到目前为止,我们做的都是一些乱七八糟的不值一提的东西,下面要注意了哦。

双击对话框,创建一个对话框类,我叫它“CWLSMusicDlg”,加上名字缩写防止盗版啊,可惜全拼太长了……


默认的选项,用第一个,新建一个类,选ok。在类名处写“CWLSMusicDlg”,基类用“CDialog”。Autionmation默认None

现在在ClassView中可以看到我添加的类了。功能先不急于实现,事实上现在这个类就可以导出了。让我先编译下试试。算了,直接F7也可以。

看到了什么,一个编译错误。

呃,图片大了看不清,我拷贝了出来:“fatal error C1083: Cannot open include file: ' \ add additional includes here': Invalid argument”。对于这个问题,只要注掉那行就可以了,如图。

F7下试试,又有两个错误,但实际上是一个。如图。


这次的问题是没有识别出对话框的资源。我是这样解决的:在FileView中可以看到一个“Header Files”的文件夹,点开它会看到一个“Resource.h”的文件。在这个文件里面有我们添加的所有资源的ID号。找到那个对话框ID,把它添加到类CWLSMusicDlg声明的前面。如下图。


再编译链接下,没问题了。至少是没有明显的问题。

但是实际上我们还没有导出我们的对话框类。需要手工的修改一下代码,加一个小东西:AFX_EXT_CLASS。如图。

至此,导出对话框类已经做好了,下面是使用这个类。

我先在一个对话框中使用这个类。成不成功不知道,先试一下。

先创建一个MFC应用程序,选择对话框选项,finish。如图。

然后调整一下对话框的大小,因为带回我会把上面的对话框加载到这个对话框上。我把它弄成了这个样子。如图。

我先使用隐式加载试一下。因为我知道隐式加载一定成功。

把前面生成的“ExDllDlg.dll”“ExDllDlg.lib”以及“WLSMusicDlg.h”拷贝到可执行文件的目录下。然后把它们添加到工程。在FileView中点击“TestExtDllDlg”,在其上右击选择“Add File to Project...”,选择“WLSMusicDlg.h”,确定。如图。

现在在ClassView中可以看到多了一个类“CWLSMusicDlg”。如图。


现在我要使用这个新增加的类。把它的一个实例作为成员变量供CTestExDllDlgDlg使用。(这个名字起得真不咋地,凑合着吧。)

在CTestExDllDlgDlg类的头文件上添加引用。如图。


在CTestExDllDlgDlg类的实现文件里添加对动态连接库的引用。如图。(有些人喜欢用setting设置,我喜欢用pragma,这无关紧要,纯属个人爱好而已。当然对于其他的东西来说,比如编译器选项,还是有区别的,这里不谈,详见《Windows核心编程 第五版》。

编译一下,居然过了。先高兴一下。

现在我们使用一下这个类。

在CTestExDllDlgDlg类中添加一个私有的成员变量,CWLSMusicDlg类型的m_pWLSMD,没错,它是个指针。如图。


编译一下,也过了。写完一小部分没事编译一下,是个好习惯。

初始化一下它,初始化也是个好办法,SEH也是,呵呵。

给CTestExDllDlgDlg添加一个私有的初始化函数InitialWLSMD,如图。


下面是这个函数实现的代码:(这里我不考虑什么异常、失败、释放之类的,这只是个讲解步骤的小Demo,没有写SEH,不要在意这些细节)

OnInitDialog中调用InitialWLSMD。如图。


至此,隐士加载MFC扩展DLLMFC对话框实例完成。最终效果如图。



以上是原文(http://blog.csdn.net/wlsgzl/article/details/8502106),我总结了几个问题: 

1. DLL工程和调用工程必须是同一种字符集,否则运行时会报错。

2. 使用一般的方式导出只能使用模态弹出DLL中的窗口,不然也会失败。

0 0
原创粉丝点击