MFC中制作Dll中带对话框资源的动态库
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中带对话框资源的动态库相关推荐
- 天马行空W:在C++中调用DLL中的函数
1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...
- 在C++中调用DLL中的函数
1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...
- 在C++中调用DLL中的函数(2)
本文转自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL ...
- 如何在 3dMax 中制作游戏中的战斧模型?
继续给大家分享3dMax教程:如何在3dsMax中制作战斧教程. 介绍 大家好!今天想和大家分享的是用3ds Max制作一把战斧,分享一下制作过程中用到的一些技巧和技巧.这是一个比较基础的教程,包括建 ...
- C++中调用DLL中的函数的两种方式
一.DLL源文件: extern "C" __declspec(dllexport) int add(int a, int b) {return a + b; } 二.静态调用: ...
- linux中动态链接库用扩展名,Linux操作系统下动态库的生成及链接方法是什么?...
Linux下动态库文件的扩展名为".so"(Shared Object).按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号).这样,线程函数库被称作l ...
- linux 生成dll文件,Linux和Windows平台 动态库.so和.dll文件的生成
Linux动态库的生成 1. 纯cpp文件打包动态库 将所有cpp文件和所需要的头文件放在同一文件夹,然后执行下面命令 gcc -shared - fpic *.c -o xxx.so: g++ -s ...
- php无法加载dll插件,php无法加载动态库怎么办
php无法加载动态库的解决办法:1.将PHP的集成包里的"libmySQL.dll"复制到system32目录下:2.将PHP的解压目录添加到PATH里:3.在Apache的配置文 ...
- Vs2010 MFC 简单制作过程中的问题
以前做过一段时间MFC,都忘得差不多了,最近又做了一个小界面.发现与vs2005中MFC有许多不同之处. vs2010的Dialog基类默认选择的是"CDialogEx". 1. ...
最新文章
- SpringCloud确保服务只能通过gateway转发访问,禁止直接调用接口访问
- 美国DARPA204页可解释人工智能文献综述论文《Explanation in Human-AI Systems》
- 使用Windows Live Writer发布日志
- 是把计算机分析和恢复力实测,土木工程测试试题.docx
- VC++ 下使用QT初步入门学习
- fastjson 使用总结
- java连接mysql数据库C3P0入门
- 学习Spring Boot:(五)使用 devtools热部署
- poj3276(Face The Right Way)反转(开关问题)
- GUI 尚学堂马士兵视频上留的作业,自己改出来的
- 阿里云4核8G服务器10M带宽支持在线人数并发量计算
- 高效的APP在线制作平台,让梦想轻松孵化器
- 微信小程序开发手记之七:一个小程序上线后的总结(上)
- Hexo之静态+动态背景设置
- 国开大学 C语言程序 形考任务4,[国家开放大学] 国开电大人体生理学形考任务4...
- python datetime strftime_datetime.strftime时间输出转换
- 转行产品经理,必看的避坑指南!
- 【毕业设计】基于STM32的智能台灯设计 物联网 电子信息 APP远程控制
- 冒泡已知4个数c语言,C语言-《一维数和冒泡算法》.ppt
- Ubuntu22.04TLS插入3.5mm耳机没有声音
热门文章
- 一个人怎样才算见过世面?
- Windows 镂空图标,“百变硬汉”
- 学习teardrop攻击并伪造一个ip包
- word转html linux java,Java-linux下如何代码实现word转换成html
- 用VBA代码下载网络上的文件
- 软件授权与加密技术简单原理
- 如何安装linux安装光盘中的软件包
- 反爬虫SSL TLS指纹识别和绕过JA3算法.md
- 智禾教育:淘宝店铺的常见类型有哪些,智禾为你分享介绍
- java迅雷下载excel,Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)...