zoukankan      html  css  js  c++  java
  • MFC扩展DLL导出对话框类

    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对话框实例完成。最终效果如图。


  • 相关阅读:
    ES6(二)解构赋值详解
    面试题
    说出x的结果,并解释为什么?
    23种设计模式
    自定义滚动条
    JavaScript之数据类型
    [[转]CSS浮动原理
    正选反选JS
    让2个并列的div根据内容自动保持同等高度js
    jquery鼠标滑过展示图片时显示详情
  • 原文地址:https://www.cnblogs.com/wlsandwho/p/4202192.html
Copyright © 2011-2022 走看看