基于深入浅出讲的比较泛,根据找到的网上的资料的修改,因为真正实践发现不少资料有小bug。总结出下面两个例子:
Demo 1
点击较多的这篇MFC扩展DLL导出对话框类,做了少量修改 【在网上看了一下,关于“dll导出对话框类”的搜索,基本上都是2个人的帖子,大家各种转载,创建的类一个名字叫CDlgDog,另一个叫GameDlg。纵观天下大事,合久必分分久必合,blablabla……】
创建类DLL
1、新建项目 选择MFC DLL
之后选MFC扩展DLL
2、给资源添加一个“Dialog”,并给对话框添加两个编辑框Edit Control。因为添加了资源,所以在“StdAfx.h”文件中加上“#include “resource.h””
对话框属性改为无边框的子对话框,在“Styles”中把Styles改成“Child”,把“Border”改成“None”
3、双击对话框,创建一个对话框类,命名为“CMusicDlg”。在类的.h头文件中的函数定义中加入AFX_EXT_CLASS
如:
F7编译,此时DLL文件已经准备好。在debug文件夹下能找到ClassDLL.dll和ClassDLL.lib文件。
加载类DLL,写测试函数
1、先创建一个MFC应用程序,选择基于对话框选项,finish。
调整一下对话框的大小,用隐式加载的办法加载上面的类
2、拷贝MusicDlg.h(导出对话框的类名)和ClassDLL.lib文件到测试程序目录下,并将头文件添加到工程中。注意拷贝的时候,ClassDLL.dll应该放在debug文件夹下
3、载体对话框对应的类为CDLLappDlg。
在DLLappDlg.h头文件里添加引用,如图
在CDLLappDlg的实现文件添加对ClassDLL.lib文件的引用,此处用pragma
4、解决DLL类对应的对话框资源的IDD问题
在DLLappDlg.cpp实现文件里添加引用
#include "MusicDlg.h"
5、在实现文件里添加初始化和函数调用的程序
在CDLLappDlg类中添加私有的成员变量和初始化函数,CMusicDlg类型的m_pMD和布尔型的InitialMD
private:
CMusicDlg *m_pMD;//使用类的时候添加的私有成员变量
bool InitialMD(void);
如图:此处IDD为导出对话框对应的IDD。
在OnInitDialog中调用InitialMD。即在载体对话框类的实现代码中加入:
bool CDLLappDlg::InitialMD()
{
m_pMD=new CMusicDlg;
m_pMD->Create(IDD_DIALOG1,this);
m_pMD->ShowWindow(SW_SHOW);
return TRUE;
}
6、会出现的bug
在类MusicDlg的头文件中加入DECLARE_MESSAGE_MAP()
Demo 2
第二火的就是这篇类名是dog的 实现MFC扩展DLL中导出类和对话框(这个好)
创建类DLL
1、第一步依旧是新建扩展DLL
2、建立输出类
与Demo1 的区别是我们细化这个类,给他加入成员变量和函数
新建类名为CDogClass,在”Base Class”下输入CObject,然后”OK”;
DogClass.h头文件:
#pragma once
class AFX_EXT_CLASS CDogClass:public CObject
{
private :
int m_nNum;
CString m_sData;
public:
int ShowDlg();
void Init();
void SetNum(int num) { m_nNum = num;};
int GetNum() { return m_nNum; };
void SetData(CString data) { m_sData = data;};
CString GetData() { return m_sData; };
CDogClass(void);
~CDogClass(void);
};
DogClass.cpp实现文件:
#include "StdAfx.h"
#include "DogClass.h"
#include "DlgDog.h"
CDogClass::CDogClass(void)
{
Init();
}
CDogClass::~CDogClass(void)
{
}
void CDogClass::Init()
{
m_nNum = 0;
m_sData = "";
}
int CDogClass::ShowDlg(void)
{
CDlgDog dlg;
dlg.m_nNum = GetNum();
dlg.m_sData = GetData();
if (IDOK==dlg.DoModal())
{
SetNum(dlg.m_nNum);
SetData(dlg.m_sData);
return 1;
}
return 0;
}
导出类:编辑DogClass.h头文件修改下面一行;class AFX_EXT_CLASS CDogClass : public CObject
3、建立对话框类,并实现输出类对它的调用
对话框类名为CDlgDog,为两编辑框添加int m_nNum和CString m_sData的变量(右键添加变量)。
public:
int m_nNum;
CString m_sData;
添加了资源,所以在“StdAfx.h”文件中加上“#include “resource.h””
在导出类DogClass.cpp中加入#include “DlgDog.h”
在DogClass类中添加int ShowDlg();函数用来调用对话框,并在int CDogClass::ShowDlg()中添加代码
如果遇到bug:“DDX_Control”: 不能将参数 3 从“int”转换为“CWnd &”
DDX_Control(pDX, ***, ***);改成 DDX_Text(pDX, ***, ***);
前者是控件型后者是数据型
建立DLL 测试程序
1、新建一个基于对话框的MFC应用程序
添加一按钮IDC_BUTTON1,并在按钮事件中添加如如下代码:
void CClassAppDlg::OnBnClickedButton1()
{
CDogClass dog;
dog.Init();
if (dog.ShowDlg()!=0)
{
CString str;
str.Format(_T("Num is: %d Data is: %s"),dog.GetNum(), dog.GetData());
AfxMessageBox(str);
}
}
2、拷贝DogClass.h、ClassNeed.lib和ClassNeed.dll
在对话框类的实现文件中加入#include “DogClass.h”行
并添加对ClassDLL.lib文件的引用,此处用pragma
#include "stdafx.h"
#include "ClassApp.h"
#include "ClassAppDlg.h"
#include "DogClass.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#pragma comment(lib,"ClassNeed.lib")