65.9K
CodeProject 正在变化。 阅读更多。
Home

DLL 非常简单:第二部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (71投票s)

2004 年 9 月 21 日

2分钟阅读

viewsIcon

234910

downloadIcon

4395

本文介绍了如何从 DLL 导出类。

Sample Image - SimpleDll2.gif

引言

在之前的文章中,我简单提到了 DLL 的创建和使用。但它只导出了函数。现在,我想描述“如何从 DLL 导出类?”

如何构建包含新类的 MFC DLL?

  1. 运行 VC++。
  2. 选择:文件 > 新建。
  3. 创建“MFC AppWizard (DLL)”(例如:MyScndDll)。
  4. 在“ClassView”中的根分支上单击鼠标右键,指向并单击“New Class...”。
  5. 选择 Generic Class 作为类类型,并将其命名为例如 CRectArea。
  6. 在“RectArea.h”文件的顶部声明
    //
    #define DLLEXPORT __declspec(dllexport)
    //

    __declspec(dllexport) 的目的是将“导出指令”添加到对象文件中,因此您不需要 .DEF 文件。 为了使代码更易于阅读,为 __declspec(dllexport) 定义一个宏:DLLEXPORT

  7. 现在,对于您想要的每个要导出的类,在其声明之前键入:“DLLEXPORT”,像这样
    class DLLEXPORT CRectArea
    {
       public:
       CRectArea();
       virtual ~CRectArea();
    };
  8. 现在,为新创建的类声明一个成员函数。 例如,Calculate
    class DLLEXPORT CRectArea 
    {
    public:
        int Calculate(int ParOne,int ParTwo);
        CRectArea();
        virtual ~CRectArea();
    };
  9. 并定义它
    int CRectArea::Calculate(int ParOne,int ParTwo)
    {
        return ParOne*ParTwo;
    }
  10. 按下构建按钮。
  11. 从烤箱中取出 DLL!

注意:链接器还会构建一个“导入库”,其名称与 DLL 相同,但扩展名为 .lib

如何使用 MFC DLL?

  1. 运行 VC++。
  2. 选择:文件 > 新建。
  3. 创建“MFC AppWizard (exe)”。
  4. 选择“基于对话框”,然后单击完成。
  5. 选择:项目 > 添加到项目 > 新建 > C/C++ 标头文件。
  6. 命名文件,例如:Imports
  7. Imports.h 中声明
    //
    #define DLLIMPORT __declspec(dllimport) 
    //

    __declspec(dllimport) 的目的是将“导入指令”添加到对象文件中。 为了使代码更易于阅读,为 __declspec(dllimport) 定义一个宏:DLLIMPORT

  8. 在其后键入从 DLL 导出的函数的声明。 注意:每当我们打算导入类时,都必须键入“DLLIMPORT
    class DLLIMPORT CRectArea
    {
       public:
       int Calculate(int ParOne,int ParTwo);
       CRectArea();
       virtual ~CRectArea();
    };

    这与您在 DLL 中声明和定义的类相同。 在这里,介绍为“导入类”。 但是它对于当前项目是未知的,我们必须为链接器解决它。

  9. 从前一个项目中的 releasedebug 文件夹(取决于当前项目设置)复制 .lib 文件到当前项目目录,因为它必须与 EXE 链接。 在 .lib 文件(相同的导入库)中,存在有关从 DLL 导出的类的信息。
  10. 返回到 VC++ 环境并选择:项目 > 设置 > 链接(选项卡)。
  11. 在“对象/库模块:”中键入 [前一个项目的 .lib 文件]

    例如:MyScndDll.lib,然后按确定。 它将解析外部引用。 这里:CRectArea 类。

  12. 因为我们打算在 ...Dlg.cpp 文件(例如:ImportClassDlg.cpp)中使用函数,所以在文件顶部键入
    //
    #include "Imports.h"
    //
  13. 现在,您可以像这样使用导出类的函数

    void CImportClassDlg::OnCalc() 
    {
       UpdateData();
       m_Result=m_RectArea.Calculate(m_ParOne,m_ParTwo);
       UpdateData(FALSE);
    }
© . All rights reserved.