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 )
****************************************************************
如果有技术上的问题,可以留言询问,我会及时回复的。
如果喜欢,可否赞一个,不胜感激 嘿~~