DLL 非常简单:第二部分






4.91/5 (71投票s)
2004 年 9 月 21 日
2分钟阅读

234910

4395
本文介绍了如何从 DLL 导出类。
引言
在之前的文章中,我简单提到了 DLL 的创建和使用。但它只导出了函数。现在,我想描述“如何从 DLL 导出类?”
如何构建包含新类的 MFC DLL?
- 运行 VC++。
- 选择:文件 > 新建。
- 创建“MFC AppWizard (DLL)”(例如:MyScndDll)。
- 在“ClassView”中的根分支上单击鼠标右键,指向并单击“New Class...”。
- 选择 Generic Class 作为类类型,并将其命名为例如 CRectArea。
- 在“RectArea.h”文件的顶部声明
// #define DLLEXPORT __declspec(dllexport) //
__declspec(dllexport)
的目的是将“导出指令”添加到对象文件中,因此您不需要 .DEF 文件。 为了使代码更易于阅读,为__declspec(dllexport)
定义一个宏:DLLEXPORT
。 - 现在,对于您想要的每个要导出的类,在其声明之前键入:“
DLLEXPORT
”,像这样class DLLEXPORT CRectArea { public: CRectArea(); virtual ~CRectArea(); };
- 现在,为新创建的类声明一个成员函数。 例如,
Calculate
class DLLEXPORT CRectArea { public: int Calculate(int ParOne,int ParTwo); CRectArea(); virtual ~CRectArea(); };
- 并定义它
int CRectArea::Calculate(int ParOne,int ParTwo) { return ParOne*ParTwo; }
- 按下构建按钮。
- 从烤箱中取出 DLL!
注意:链接器还会构建一个“导入库”,其名称与 DLL 相同,但扩展名为 .lib。
如何使用 MFC DLL?
- 运行 VC++。
- 选择:文件 > 新建。
- 创建“MFC AppWizard (exe)”。
- 选择“基于对话框”,然后单击完成。
- 选择:项目 > 添加到项目 > 新建 > C/C++ 标头文件。
- 命名文件,例如:Imports。
- 在 Imports.h 中声明
// #define DLLIMPORT __declspec(dllimport) //
__declspec(dllimport)
的目的是将“导入指令”添加到对象文件中。 为了使代码更易于阅读,为__declspec(dllimport)
定义一个宏:DLLIMPORT
。 - 在其后键入从 DLL 导出的函数的声明。 注意:每当我们打算导入类时,都必须键入“
DLLIMPORT
”class DLLIMPORT CRectArea { public: int Calculate(int ParOne,int ParTwo); CRectArea(); virtual ~CRectArea(); };
这与您在 DLL 中声明和定义的类相同。 在这里,介绍为“导入类”。 但是它对于当前项目是未知的,我们必须为链接器解决它。
- 从前一个项目中的 release 或 debug 文件夹(取决于当前项目设置)复制 .lib 文件到当前项目目录,因为它必须与 EXE 链接。 在 .lib 文件(相同的导入库)中,存在有关从 DLL 导出的类的信息。
- 返回到 VC++ 环境并选择:项目 > 设置 > 链接(选项卡)。
- 在“对象/库模块:”中键入 [前一个项目的 .lib 文件]
例如:MyScndDll.lib,然后按确定。 它将解析外部引用。 这里:
CRectArea
类。 - 因为我们打算在 ...Dlg.cpp 文件(例如:ImportClassDlg.cpp)中使用函数,所以在文件顶部键入
// #include "Imports.h" //
- 现在,您可以像这样使用导出类的函数
void CImportClassDlg::OnCalc() { UpdateData(); m_Result=m_RectArea.Calculate(m_ParOne,m_ParTwo); UpdateData(FALSE); }