动态库学习 第1章——演练:创建和使用动态链接库 (C++)

演练:创建和使用动态链接库 (C++)

 

Visual Studio 2008

我们将创建的第一种类型的库是动态链接库 (DLL)。 使用 DLL 是一种重用代码的绝佳方式。 您不必在自己创建的每个程序中重新实现同一例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它们即可。

本演练涵盖以下内容:

  • 创建新的动态链接库 (DLL) 项目。
  • 向动态链接库添加类。
  • 创建引用动态链接库的应用程序。
  • 在控制台应用程序中使用类库的功能。
  • 运行应用程序。

系统必备


本主题假定您具备 C++ 语言的基础知识。 如果您是刚开始学习 C++,建议您参阅 Herb Schildt 编写的“C++ Beginner's Guide”(《C++ 初学者指南》),该书可从 http://go.microsoft.com/fwlink/?LinkId=115303 在线获得。

创建新的动态链接库 (DLL) 项目

  1. 文件菜单中,选择新建,然后选择项目…”
  2. 项目类型窗格中,选择“Visual C++”下的“Win32”
  3. 模板窗格中,选择“Win32 控制台应用程序
  4. 为项目选择一个名称,如 MathFuncsDll,并将其键入名称字段。 为解决方案选择一个名称,如 DynamicLibrary,并将其键入解决方案名称字段。
  5. 单击确定启动 Win32 应用程序向导。 在“Win32 应用程序向导对话框的概述页中,单击下一步
  6. “Win32 应用程序向导中的应用程序设置页中,选择应用程序类型下的“DLL”(如果可用),或者选择控制台应用程序(如果“DLL”不可用)。 某些版本的 Visual Studio 不支持通过使用向导创建 DLL 项目。 您可以稍后对此进行更改,以将项目编译为 DLL。
  7. “Win32 应用程序向导应用程序设置页中,选择附加选项下的空项目
  8. 单击完成创建项目。

向动态链接库添加类

  1. 若要为新类创建头文件,请从项目菜单中选择添加新项…”。 将显示添加新项对话框。 在类别窗格中,选择“Visual C++”下的代码。 在模板窗格中选择头文件(.h)”。 为头文件选择一个名称,如 MathFuncsDll.h,并单击添加。 将显示一个空白文件。
  2. 添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。 代码应与以下内容类似:

复制

// MathFuncsDll.h

 

namespace MathFuncs

{

    class MyMathFuncs

    {

    public:

        // Returns a + b

        static __declspec(dllexport) double Add(double a, double b);

 

        // Returns a - b

        static __declspec(dllexport) double Subtract(double a, double b);

 

        // Returns a * b

        static __declspec(dllexport) double Multiply(double a, double b);

 

        // Returns a / b

        // Throws DivideByZeroException if b is 0

        static __declspec(dllexport) double Divide(double a, double b);

    };

}

  1. 请注意此代码方法声明中的 __declspec(dllexport) 修饰符。 这些修饰符使 DLL 能够导出该方法以供其他应用程序使用。 有关更多信息,请参见 dllexport, dllimport
  2. 若要为新类创建源文件,请从项目菜单中选择添加新项…”。 将显示添加新项对话框。 在类别窗格中,选择“Visual C++”下的代码。 在模板窗格中,选择“C++ 文件(.cpp)”。 为源文件选择一个名称,如 MathFuncsDll.cpp,并单击添加。 将显示一个空白文件。
  3. 在源文件中实现“MyMathFuncs”的功能。 代码应与以下内容类似:

复制

// MathFuncsDll.cpp

// compile with: /EHsc /LD

 

#include "MathFuncsDll.h"

 

#include <stdexcept>

 

using namespace std;

 

namespace MathFuncs

{

    double MyMathFuncs::Add(double a, double b)

    {

        return a + b;

    }

 

    double MyMathFuncs::Subtract(double a, double b)

    {

        return a - b;

    }

 

    double MyMathFuncs::Multiply(double a, double b)

    {

        return a * b;

    }

 

    double MyMathFuncs::Divide(double a, double b)

    {

        if (b == 0)

        {

            throw new invalid_argument("b cannot be zero!");

        }

 

        return a / b;

    }

}

  1. 若要将项目生成为 DLL,请从项目菜单中选择 MathFuncsDll属性...”。 在左窗格中,选择配置属性下的常规。 在右窗格中,将配置类型更改为动态库(.dll)”。 单击确定保存更改。

注意

如果您从命令行生成项目,请使用 /LD 编译器选项指定输出文件应为 DLL。 有关更多信息,请参见 /MD、/MT、/LD(使用运行库)

  1. 编译该动态链接库,方法是选择生成菜单中的生成解决方案。 这样就创建了一个可供其他程序使用的 DLL。 有关 DLL 的详细信息,请参见 DLL

创建引用动态链接库的应用程序

  1. 若要创建将引用并使用刚创建的动态链接库的应用程序,请从文件菜单中选择新建,然后选择项目...”
  2. 项目类型窗格中,选择“Visual C++”下的“Win32”
  3. 模板窗格中,选择“Win32 控制台应用程序
  4. 为项目选择一个名称(如 MyExecRefsDll),并将其键入名称字段。 从解决方案旁边的下拉列表中选择添入解决方案。 这会将新项目添加到该动态链接库所属的同一个解决方案中。
  5. 单击确定启动“Win32 应用程序向导。 在“Win32 应用程序向导对话框的概述页中,单击下一步
  6. “Win32 应用程序向导应用程序设置页中,选择应用程序类型下的控制台应用程序
  7. “Win32 应用程序向导应用程序设置页中,清除附加选项下的预编译头复选框。
  8. 完成创建项目。

在控制台应用程序中使用类库的功能

  1. 创建新的控制台应用程序后,将为您创建一个空程序。 源文件的名称与您在前面为项目选择的名称相同。 在本示例中,名为“MyExecRefsDll.cpp”。
  2. 若要使用在动态链接库中创建的算术例程,则必须引用该库。 若要执行此操作,请在解决方案资源管理器中选择 MyExecRefsDll 项目,然后从项目菜单中选择引用...”。 在属性页对话框中,展开通用属性节点,选择框架和引用,然后选择添加新引用...”按钮。 有关引用...”对话框的更多信息,请参见“<Projectname> 属性页”对话框 ->“通用属性”->“框架和引用”
  3. 显示添加引用对话框。 此对话框列出了所有可以引用的库。 项目选项卡列出了当前解决方案中的所有项目,以及它们包含的所有库。 在项目选项卡中,选择 MathFuncsDll。 然后单击确定
  4. 若要引用动态链接库的头文件,必须修改包含目录路径。 为此,请在属性页对话框中展开配置属性节点,然后展开“C/C++”节点,并选择常规。 在附加包含目录旁边,键入 MathFuncsDll.h 头文件所在位置的路径。
  5. 可执行文件仅在运行时加载动态链接库。 必须告诉系统在哪里查找“MathFuncsDll.dll”。 您可以通过使用 PATH 环境变量做到这一点。 为此,请在属性页对话框中展开配置属性节点,并选择调试。 在环境旁边键入以下内容:PATH=<MathFuncsDll.dll 文件的路径>,其中 <MathFuncsDll.dll 文件的路径> 应替换为 MathFuncsDll.dll 的实际位置。 单击确定保存所有更改。

注意

如果要从命令行而不是从 Visual Studio 运行可执行文件,则必须在命令提示符处手动更新 PATH 环境变量,如下所示:set PATH=%PATH%;<MathFuncsDll.dll 文件的路径>,其中 <MathFuncsDll.dll 文件的路径> 应替换为 MathFuncsDll.dll 的实际位置。

  1. 现在,可以在应用程序中使用“MyMathFuncs”类了。 使用以下代码替换“MyExecRefsDll.cpp”的内容:

复制

// MyExecRefsDll.cpp

// compile with: /EHsc /link MathFuncsDll.lib

 

#include <iostream>

 

#include "MathFuncsDll.h"

 

using namespace std;

 

int main()

{

    double a = 7.4;

    int b = 99;

 

    cout << "a + b = " <<

        MathFuncs::MyMathFuncs::Add(a, b) << endl;

    cout << "a - b = " <<

        MathFuncs::MyMathFuncs::Subtract(a, b) << endl;

    cout << "a * b = " <<

        MathFuncs::MyMathFuncs::Multiply(a, b) << endl;

    cout << "a / b = " <<

        MathFuncs::MyMathFuncs::Divide(a, b) << endl;

 

    return 0;

}

  1. 通过从生成菜单中选择生成解决方案,生成可执行文件。

运行应用程序

  1. 确保选择“MyExecRefsDll”作为默认项目。 在解决方案资源管理器中,选择 MyExecRefsDll,然后选择项目菜单中的设为启动项目
  2. 若要运行项目,请选择调试菜单中的开始执行(不调试)。 输出应该与下面的内容类似:

复制

a + b = 106.4

a - b = -91.6

a * b = 732.6

a / b = 0.0747475

 

posted on 2012-05-07 16:21  cv_ml_张欣男  阅读(496)  评论(0编辑  收藏  举报

导航