DLL制作

  • 格式:doc
  • 大小:171.00 KB
  • 文档页数:22

实现MFC扩展DLL中导出类和对话框

中国学生网 2006-03-03 07:30:11 作者:江上飞鸟 来源:vckbase

如果要编写模块化的软件,就要对对动态链接库(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了。

Visual C++ 中

建 立 MFC 扩 展 DLL

减小字体 增大字体 在 Visual C++ 中 建 立 MFC 扩 展 DLL 我 们 编 写 了 一 个 扩 展 类 的 样 例 并 将 其 封 装 在

DLL 中 以 向 你 演 示 该 过 程。

有 经 验 的 Windows 编 程 人 员 都 逐 渐 放 弃 了 Windows SDK, 而 转 向

能 为 Windows 内 置 的 低 级 机 制 提 供 高 级 抽 象 的 开 发 环 境。 这 种 转 移

的 一 个 主 要 受 益 者 是 Visual C++, 它 依 靠 MFC 库 来 提 供 Windows API 的 面 向 对 象 的 视 图。

MFC 是 经 验 丰 富 的 编 程 人 员 掌 握 的 有 力 工 具, 但 它 离 完 美 还 相 距 甚 远。 事 实 上, 我 所 认 识 的 以 MFC 编 程 为 谋 生 手 段 的 人 都 开 发 了 他 或 她 自 己 的 扩 展 集 合, 他 们 以 MFC 类 作 为 基 础 类 来 派 生 自 己 的

类。 这 毕 竟 是 C++ 的 威 力。 如 果 某 个 类 不 能 满 足 你 的 需 求 ( 而 且 如

果 它 恰 好 可 以 作 为 设 计 的 开 始 ), 你 可 以 从 它 自 由 地 派 生 新 类 并 修

改 你 不 喜 欢 的 部 分。

假 设 你 编 写 了 一 个 MFC 扩 展 集 合, 并 愿 意 与 公 司 的 其 它 开 发 人 员 共 享。 你 该 如 何 封 装 这 些 扩 展 呢? 你 可 以 分 发 源 代 码 文 件 或 与 Visual C++ 组 件 库(Component Gallery) 兼 容 的 组 件。 或 许 你 可 以 象 MFC

那 样 在 DLL 中 封 装 你 的 扩 展。 就 象 传 统 的 DLL 能 够 导 出 函 数 一 样, MFC 扩 展 DLL 可 以 导 出 类。 任 何 动 态 链 接 到 MFC DLL 的 应 用 程 序 都 能

动 态 链 接 到 MFC 扩 展 DLL。 作 为 开 发 者, 你 只 需 使 其 包 括 必 要 的 头

文 件 并 在 应 用 程 序 的 链 接 列 表 中 添 加 DLL 导 入 库。

编 写 MFC 扩 展 DLL 困 难 吗? 有 了 Visual C++ 和 MFC 的 支 持, 这 实 际

非 常 轻 松。 本 文 解 释 了 如 何 创 建 MFC 扩 展 DLL 来 弥 补 MFC 的 CToolTipCtrl 类 的 明 显 不 足。 一 旦 意 识 到 其 简 便 性, 你 会 忍 不 住 亲 自 编 写 几 个 MFC 的 扩 展。

编 写 MFC 扩 展 DLL

从 理 论 角 度 而 言, MFC 的 CTool-TipCtrl 类 简 化 了 将 提 示 信 息(ToolTip) 与 对 话 框 的 控 件 或 窗 口 的 任 意 区 域 相 关 联 的 过 程。 ( 提 示 信 息

是 当 鼠 标 光 标 停 滞 于 工 具 栏 按 钮 或 其 它 UI 对 象 时 弹 出 的 小 型 帮 助 文 本 窗 口。 ) 但 有 个 问 题 尚 待 解 决。 由 于 CToolTipCtrl::AddTool 不 能 自

动 成 为 提 示 信 息 依 附 的 窗 口 的 子 类, 因 此 鼠 标 事 件 必 须 手 工 转 交

给 提 示 信 息 控 制。 这 通 常 意 味 着 你 必 须 自 己 给 窗 口 建 立 子 类。

如 果 你 给 CToolTipCtrl 对 象 下 的 提 示 信 息 控 制 传 送 了 正 确 的 标

志, 它 应 该 能 给 自 己 创 建 子 类 ―― 这 显 然 是 被 MFC 设 计 组 忽 略 的 功

能。 幸 运 的 是, 该 疏 忽 并 不 难 以 纠 正。 只 要 从 CToolTipCtrl 类 中 派 生 出