您的位置:首页 > 其它

MFC扩展DLL导出对话框类的实现---VS2005

2016-03-13 23:40 351 查看
基于深入浅出讲的比较泛,根据找到的网上的资料的修改,因为真正实践发现不少资料有小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")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: