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 )

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

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

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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糯诺诺米团

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值