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

基于深入浅出讲的比较泛,根据找到的网上的资料的修改,因为真正实践发现不少资料有小bug。总结出下面两个例子:
Demo 1
点击较多的这篇MFC扩展DLL导出对话框类,做了少量修改 【在网上看了一下,关于“dll导出对话框类”的搜索,基本上都是2个人的帖子,大家各种转载,创建的类一个名字叫CDlgDog,另一个叫GameDlg。纵观天下大事,合久必分分久必合,blablabla……】
创建类DLL
1、新建项目 选择MFC DLL
MFC扩展DLL导出对话框类的实现---VS2005_第1张图片
之后选MFC扩展DLL
2、给资源添加一个“Dialog”,并给对话框添加两个编辑框Edit Control。因为添加了资源,所以在“StdAfx.h”文件中加上“#include “resource.h””
对话框属性改为无边框的子对话框,在“Styles”中把Styles改成“Child”,把“Border”改成“None”
3、双击对话框,创建一个对话框类,命名为“CMusicDlg”。在类的.h头文件中的函数定义中加入AFX_EXT_CLASS
如:
MFC扩展DLL导出对话框类的实现---VS2005_第2张图片
F7编译,此时DLL文件已经准备好。在debug文件夹下能找到ClassDLL.dll和ClassDLL.lib文件。
加载类DLL,写测试函数
1、先创建一个MFC应用程序,选择基于对话框选项,finish。
调整一下对话框的大小,用隐式加载的办法加载上面的类
2、拷贝MusicDlg.h(导出对话框的类名)和ClassDLL.lib文件到测试程序目录下,并将头文件添加到工程中。注意拷贝的时候,ClassDLL.dll应该放在debug文件夹下
3、载体对话框对应的类为CDLLappDlg。
在DLLappDlg.h头文件里添加引用,如图
MFC扩展DLL导出对话框类的实现---VS2005_第3张图片
在CDLLappDlg的实现文件添加对ClassDLL.lib文件的引用,此处用pragma
MFC扩展DLL导出对话框类的实现---VS2005_第4张图片
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")

你可能感兴趣的:(MFC,dll)