如果要编写模块化的软件,就要对对动态链接库(DLL)有一定的了解,本人这段时间在修改以前的软件时,决定把重复用的类和对话框做到DLL中,下面就从一个简单的例子讲起,如何实现MFC扩展DLL中导出类和对话框。

  一、创建MFC扩展DLL

  步骤:

  运行Visual Studio 6.0->File->New...->Projects;

  选择Mfc AppWizard(dll),在右边Project name下输入ExportClass,单击“下一步”;

  选择Mfc Extension DLL (using share MFC DLL) 单击“finish”;

  以上完成建立扩展DLL的框架,下面接着建立输出类:

  Insert->New Class...在打开的对话框中,"Class Type" 选择"Generic Class",Class Name 中输入CDogClass(当然你可以用其它的名称,我喜欢小狗,所有用它了,在"Base Class"下输入CObject,然后"OK";为类添加两个测试用的变量 int m_nNum;CString m_sData;完全的类信息如下:

  DogClass.h头文件:

class CDogClass : public CObject
{
 private :
  int m_nNum;
  CString m_sData;
 public:
  int ShowDlg();
  void Init();
  CDogClass();
  virtual ~CDogClass();
  void SetNum(int num) { m_nNum = num;};
  int GetNum() { return m_nNum; };
  void SetData(CString data) { m_sData = data;};
  CString GetData() { return m_sData; };
};

DogClass.cpp实现文件: CDogClass::CDogClass()
{
 Init();
}

CDogClass::~CDogClass()
{
}

void CDogClass::Init()
{
  m_nNum = 0;
  m_sData = "";
}

  编辑DogClass.h头文件修改下面一行;class AFX_EXT_CLASS CDogClass : public CObject

  以上完成类的建立,下面建立输出对话框;

  Insert-> Resouce...新建立一个对话框,添加两个编辑框IDC_EDIT1,IDC_EDIT2,然后建立CDlgDog对话框类并为两编辑框添加int m_nNum和CString m_sData的变量。

  在DogClass.cpp的#include "DogClass.h"下加入#include "DlgDog.h"

  在DogClass类中添加int ShowDlg();函数用来调用对话框,并在int CDogClass::ShowDlg()中添加如下代码:

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;

  然后编译Dll,会发现有几个错误,不用怕,好解决的。

  首先,去掉DlgDog.cpp中的 #include “\ add additional includes here”这一行;其次,在stdax.h中加入include "resource.h",再编译,OK。

  二、建立DLL 测试程序

  步骤:

  新建一个基于对话框的MFC应用程序,添加一按钮IDC_BUTTON1,并在按钮事件中添加如如下代码:

void CTestExportClassDlg::OnButton1()
{
 CDogClass dog;

 dog.Init();
 if (dog.ShowDlg()!=0)
 {
  CString str;
  str.Format("Num is: %d Data is: %s" dog.GetNum(), dog.GetData());
  AfxMessageBox(str);
 }
}

  从ExportClass文件目录拷贝DogClass.h和ExportClass.lib文件到测试程序目录下;

  在TestExportClassDlg.cpp中加入#include “DogClass.h”行;往连接程序的导入库中添加ExportClass.lib,在VS的Project->Settings下的Setting For选择All Configuration.,然后在下面的页面Object/Library Conttrol中加入ExportClass.lib;

  别忘了把ExportClass.dll复制到系统目录或当前应用程序目录;然后编译就OK了。

实现MFC扩展DLL中导出类和对话框的更多相关文章

  1. DLL入门浅析(4)——从DLL中导出类

    转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90663.html 前面介绍了怎么从DLL中导出函数和变量,实际上导出类的方法也是大同小 ...

  2. [转]从普通DLL中导出C++类 – dllexport和dllimport的使用方法(中英对照、附注解)

      这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的.但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但 ...

  3. 怎样从一个DLL中导出一个C++类

    原文作者:Alex Blekhman    翻译:朱金灿 原文来源: http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx 译 ...

  4. DLL中导出STL模板类的问题

    接上一篇. 上一篇的dll在编译过程中一直有一个警告warning C4251: ‘CLASS_TEST::m_structs’ : class ‘std::vector<_Ty>’ ne ...

  5. 在DLL中导出另一静态库中的函数

    开发环境: win7_x64.VS2013 应用场景: 动态库A依赖动态库B,而动态库B又使用了静态库C:有些情况下,我们需要将C从B里面导出,然后提供给A使用. 正文: Step1: 1.新建测试静 ...

  6. DLL入门浅析(3)——从DLL中导出变量

    转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90643.html 前面介绍了怎么从DLL中导出函数,下面我们来看一下如何从DLL中导出 ...

  7. DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中加上__declspec(dllexport): 另外一种方式是:采用模块定义(.def)文件声明,(.def)文件为链接器提供了有关被链接 ...

  8. (转)DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的两种方式(dllexport与.def文件)http://www.cnblogs.com/enterBeijingThreetimes/archive/2010/08/04/1792 ...

  9. 【转】DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的两种方式(dllexport与.def文件) DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中加上__declspec(dllexport):另外一种方式是:采用模块定义 ...

随机推荐

  1. Mysql查询语句,select,inner/left/right join on,group by.....[例题及答案]

    创建如下表格,命名为stu_info, course_i, score_table. 题目: 有如图所示的三张表结构,学生信息表(stu_info),课程信息表(course_i),分数信息表(sco ...

  2. 程序员的脑袋系列---利用ffmpeg命令提取音频

    今日各大播放器的版权控制越来越严格.导致很多歌曲无法听,但是MV却可以听.这样很蛋疼有木有? 然而,我们可以利用ffmpeg工具提取MV的音频,比如做成MP3格式,这样就可以听了.--哈哈(邪恶地笑) ...

  3. Java实现算法提高十进制数转八进制数

    算法提高 十进制数转八进制数 时间限制:1.0s 内存限制:512.0MB 编写函数,其功能为把一个十进制数转换为其对应的八进制数.程序读入一个十进制数,调用该函数实现数制转换后,输出对应的八进制数. ...

  4. Java实现 LeetCode 230 二叉搜索树中第K小的元素

    230. 二叉搜索树中第K小的元素 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. ...

  5. SqlServer下一些实用的sql语句收集

    清理数据库日志 USE [master] ALTER DATABASE [表名] SET RECOVERY SIMPLE WITH NO_WAIT ALTER DATABASE [表名] SET RE ...

  6. 96题--不同的二叉搜索树(java、中等难度)

    题目描述:给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例如下: 分析:本题可用动态规划的方法求解. 设 dp[n] 表示以 1 ... n 为节点组成的二叉搜索树的种类 ...

  7. monkey命令的基本使用

    看到monkey,你想到了什么?今天给大家分享下monkey命令的基本使用 monkey测试是Android平台自动化测试的一种手段,通过monkey程序模拟用户触摸屏幕,滑动.按键操作等操作对设备上 ...

  8. UniRx精讲(一):UniRx简介&定时功能实现

    1.UniRx 简介 UniRx 是一个 Unity3D 的编程框架.它专注于解决时间上异步的逻辑,使得异步逻辑的实现更加简洁和优雅. 简洁优雅如何体现? 比如,实现一个"只处理第一次鼠标点 ...

  9. spring源码解读-aop

    aop是指面向切面编程,ProxyFactoryBean是spring aop的底层实现与源头,为什么这么说呢?首先我们看一段配置: 1.target是目标对象,需要对其进行切面增强 2.proxyI ...

  10. VS Code项目中通过npm包的方式共享代码片段的方案实现

    VS Code项目中通过npm包的方式共享代码片段的方案实现 上周在 "VS Code项目中共享自定义的代码片段方案" 的文章中提到过一个共享代码片段的方案,上周经过调研后并没有发 ...