Data:2019/10/23

这篇文章本来是17年写的,现在对这边文章进行细化。更新的是有一些晚了些

想要在MFC中的dll里面添加对话框资源,首先必须的条件是,当前的dll库类型必须是可扩展的DLL

以下用图片展示创建步骤

第二步:

第三步:

在这里提示:如果不是扩展DLL,创建出来的对话框无法访问

第一步:在资源中新建一个对话框Dialog,可以自行设置ID

第二步:对此对话框添加类,可以自定义类名

在创建的类中完成需要实现的功能,这里我就不过多的声明了,为了展示例子,当前类中不做任何处理,使用系统生成了类。

例如:以下是没有修改的原始类

以上分别是.h和.cpp文件,为了简单体现。

第三步:将带资源的类转化成外界导出函数可访问的类

1:首先,在.h文件中不能出现这句话。

// 对话框数据
enum { IDD = IDD_DIALOG1 };

需要将对话框的声明,放到.cpp文件中,变成一个全局ID

.h文件修改后的样式:

2:将对.cpp文件的构造函数的操作

因为对话框的ID存放到了.cpp文件中,则应该在CPP文件中包含上 对话框资源信息

#include "resource.h"

否则,当前ID == IDD_DIALOG1无法识别

然后,对构造函数进行修改,不需要继承CDialogEx

修改后如图所示

第四步:对导出的资源修改后,现在需要写导出函数的导出宏

可以新建一个叫做ExportTest.h的文件,专门用来存放导出宏定义的

如下:有动态库/静态库链接

#pragma once#if defined  (INTERRTEST_BUILD)
#    define _InterrTestExport   _declspec(dllexport)
#else
#    define _InterrTestExport  _declspec(dllimport)
#endif

一般,我都把上述内容单独存放到一个文件中,主要是为了逻辑思路清晰。

写了这个导出宏定义文件后,需要配置当前DLL的预处理器

属性 --- 配置属性 --- C/C++ --- 预处理器    添加上 INTERRTEST_BUILD

如图所示:

第五步:写导出函数

到了最重要的一个环节了。

在此,我只列举了三个功能:创建、销毁、函数应用

1:声明 TestFunc.h  和 TestFunc.cpp作为导出函数。外界只能看到 .h文件

#pragma once#include "ExportTest.h"        //宏定义的添加//创建
void    _InterrTestExport   CreateDlg(CRect  rect , CWnd  *pWnd);//销毁
void _InterrTestExport  DestroyDlg();//函数应用
void    _InterrTestExport   UseFunc(CStringW strText);

.cpp文件的实现

创建对话框的时间:

void _InterrTestExport CreateDlg(CRect rect , CWnd *pWnd)
{CTestDlg   *dlg = new CTestDlg();dlg->Create(IDD_DIALOG1 , pWnd);dlg->MoveWindow(rect);dlg->ShowWindow(SW_SHOW);
}

当写到这的时候发现,IDD_DIALOG1说找不到资源。应该把资源声明放到.cpp中

#include "resource.h"

为了验证现在制作的导出函数是否可以使用,可以编译成dll和lib在调用程序中运行下,发现是可以的。

但此时,应该想到一个问题:类的声明是在一个函数中实现的,出了这个函数之后,dlg就不存在了。

如何保证我在调用这个导出类的其他应用函数时,也能有效呢?

此时,可以用一个全局的CDialogEx  *gWndDlg = Null;来表示

则,导出函数--创建对话框  需要进行修改

void _InterrTestExport CreateDlg(CRect rect , CWnd *pWnd)
{CTestDlg   *dlg = new CTestDlg();gWndDlg = dlg;dlg->Create(IDD_DIALOG1 , pWnd);dlg->MoveWindow(rect);dlg->ShowWindow(SW_SHOW);
}

在后来的应用函数中,都是用gWndDlg来调用函数

举例说明销毁函数的使用

void _InterrTestExport DestroyDlg()
{if (gWndDlg){((CTestDlg*)gWndDlg)->DestroyWindow();}
}

其他函数的调用也应该如此。

到了,到这里制作DLL中带资源对话框的过程了。贴出完成的导出函数代码

#include "stdafx.h"
#include <afxframewndex.h>
#include "TestFunc.h"
#include "TestDlg.h"
#include "resource.h"CDialogEx        *gWndDlg = NULL;void   _InterrTestExport CreateDlg(CRect rect , CWnd *pWnd)
{AFX_MANAGE_STATE(AfxGetStaticModuleState());CTestDlg   *dlg = new CTestDlg();gWndDlg = dlg;dlg->Create(IDD_DIALOG1 , pWnd);dlg->MoveWindow(rect);dlg->ShowWindow(SW_SHOW);
}void _InterrTestExport DestroyDlg()
{if (gWndDlg){((CTestDlg*)gWndDlg)->DestroyWindow();}
}void   _InterrTestExport UseFunc(CStringW strText)
{}

****************************************************************

如果在导出库DLL中出现多重定义的错误时,只需要在对话框.h文件中添加以下内容即可

#ifdef AFX_MANAGE_STATE
# undef AFX_MANAGE_STATE
#endif
#define AFX_MANAGE_STATE( p )

****************************************************************

如果有技术上的问题,可以留言询问,我会及时回复的。

如果喜欢,可否赞一个,不胜感激 嘿~~

MFC中制作Dll中带对话框资源的动态库相关推荐

  1. 天马行空W:在C++中调用DLL中的函数

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  2. 在C++中调用DLL中的函数

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  3. 在C++中调用DLL中的函数(2)

    本文转自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL ...

  4. 如何在 3dMax 中制作游戏中的战斧模型?

    继续给大家分享3dMax教程:如何在3dsMax中制作战斧教程. 介绍 大家好!今天想和大家分享的是用3ds Max制作一把战斧,分享一下制作过程中用到的一些技巧和技巧.这是一个比较基础的教程,包括建 ...

  5. C++中调用DLL中的函数的两种方式

    一.DLL源文件: extern "C" __declspec(dllexport) int add(int a, int b) {return a + b; } 二.静态调用: ...

  6. linux中动态链接库用扩展名,Linux操作系统下动态库的生成及链接方法是什么?...

    Linux下动态库文件的扩展名为".so"(Shared Object).按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号).这样,线程函数库被称作l ...

  7. linux 生成dll文件,Linux和Windows平台 动态库.so和.dll文件的生成

    Linux动态库的生成 1. 纯cpp文件打包动态库 将所有cpp文件和所需要的头文件放在同一文件夹,然后执行下面命令 gcc -shared - fpic *.c -o xxx.so: g++ -s ...

  8. php无法加载dll插件,php无法加载动态库怎么办

    php无法加载动态库的解决办法:1.将PHP的集成包里的"libmySQL.dll"复制到system32目录下:2.将PHP的解压目录添加到PATH里:3.在Apache的配置文 ...

  9. Vs2010 MFC 简单制作过程中的问题

    以前做过一段时间MFC,都忘得差不多了,最近又做了一个小界面.发现与vs2005中MFC有许多不同之处. vs2010的Dialog基类默认选择的是"CDialogEx". 1. ...

最新文章

  1. SpringCloud确保服务只能通过gateway转发访问,禁止直接调用接口访问
  2. 美国DARPA204页可解释人工智能文献综述论文《Explanation in Human-AI Systems》
  3. 使用Windows Live Writer发布日志
  4. 是把计算机分析和恢复力实测,土木工程测试试题.docx
  5. VC++ 下使用QT初步入门学习
  6. fastjson 使用总结
  7. java连接mysql数据库C3P0入门
  8. 学习Spring Boot:(五)使用 devtools热部署
  9. poj3276(Face The Right Way)反转(开关问题)
  10. GUI 尚学堂马士兵视频上留的作业,自己改出来的
  11. 阿里云4核8G服务器10M带宽支持在线人数并发量计算
  12. 高效的APP在线制作平台,让梦想轻松孵化器
  13. 微信小程序开发手记之七:一个小程序上线后的总结(上)
  14. Hexo之静态+动态背景设置
  15. 国开大学 C语言程序 形考任务4,[国家开放大学] 国开电大人体生理学形考任务4...
  16. python datetime strftime_datetime.strftime时间输出转换
  17. 转行产品经理,必看的避坑指南!
  18. 【毕业设计】基于STM32的智能台灯设计 物联网 电子信息 APP远程控制
  19. 冒泡已知4个数c语言,C语言-《一维数和冒泡算法》.ppt
  20. Ubuntu22.04TLS插入3.5mm耳机没有声音

热门文章

  1. 一个人怎样才算见过世面?
  2. Windows 镂空图标,“百变硬汉”
  3. 学习teardrop攻击并伪造一个ip包
  4. word转html linux java,Java-linux下如何代码实现word转换成html
  5. 用VBA代码下载网络上的文件
  6. 软件授权与加密技术简单原理
  7. 如何安装linux安装光盘中的软件包
  8. 反爬虫SSL TLS指纹识别和绕过JA3算法.md
  9. 智禾教育:淘宝店铺的常见类型有哪些,智禾为你分享介绍
  10. java迅雷下载excel,Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)...