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

此分步演练演示如何使用 c. c++ 应用程序创建动态链接库 (DLL) 用于。 使用库是一种极佳方式重用代码。 而不是重新实现在创建的每个程序中相同的实例,将它们编写一次从要求函数的 apps 然后引用它们。 通过将代码放入 DLL,您节省在引用它的每个 app 的空间,因此,您可以更新 DLL,而无需重新编译所有 apps。 有关 DLL 的详细信息,请参见 在Visual C++的DLL

本演练涵盖以下任务:

  • 创建 DLL 项目。

  • 添加选件类到 DLL。

  • 创建使用引用加载 DLL 时动态链接的控件个 app。

  • 使用从选件类的功能在 app。

  • 运行应用程序。

本演练创建能从 apps 只调用使用 C++ 调用约定的 DLL。 有关如何用其他语言创建 DLL 的信息用于,请参见 从 Visual Basic 应用程序调用 DLL 函数

系统必备

本主题假定您具备 C++ 语言的基础知识。

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

  1. 在菜单栏上,选择**“文件”“新建**、“项目”

  2. 新建项目 对话框的左侧窗格中,展开 已安装模板Visual C++,然后选择 win32

  3. 在中间窗格中,选择 Win32 控制台应用程序

  4. 为项目指定名称 (例如,MathFuncsDll 在 名称 框。 指定名称解决方案 (如 DynamicLibrary,在 解决方案名称 框。 选择**“确定”**按钮。

  5. Win32 应用程序向导 对话框的 概述 页上,选择 下一个 按钮。

  6. 应用程序设置 页上,在 应用程序类型下,选择 dll

  7. 选择 完成 按钮创建项目。

向动态链接库添加类

  1. 若要创建新选件类的一个标头文件,在菜单栏上,选择 项目添加新项。 在 添加新项 对话框中,在左窗格中,单击 **Visual C++**下,选择 代码。 在中间窗格中,选择 头文件 (.h)。 为标头指定名称 (此文件,MathFuncsDll.h 然后选择 添加 按钮。 空白标头文件显示。

  2. 将以下代码添加到标头文件的开头:

    // MathFuncsDll.h
    
    #ifdef MATHFUNCSDLL_EXPORTS
    #define MATHFUNCSDLL_API __declspec(dllexport) 
    #else
    #define MATHFUNCSDLL_API __declspec(dllimport) 
    #endif
    
    
  3. 添加一个名为" MyMathFuncs "的基本选件类执行常见的算术运算 (如加、减、乘和除。 代码应类似于:

    namespace MathFuncs
    {
        // This class is exported from the MathFuncsDll.dll
        class MyMathFuncs
        {
        public: 
            // Returns a + b
            static MATHFUNCSDLL_API double Add(double a, double b); 
    
            // Returns a - b
            static MATHFUNCSDLL_API double Subtract(double a, double b); 
    
            // Returns a * b
            static MATHFUNCSDLL_API double Multiply(double a, double b); 
    
            // Returns a / b
            // Throws const std::invalid_argument& if b is 0
            static MATHFUNCSDLL_API double Divide(double a, double b); 
        };
    }
    

    当 MATHFUNCSDLL_EXPORTS 定义了该符号,MATHFUNCSDLL_API 符号将在成员函数声明的 __declspec(dllexport) 修饰符此代码。 此修饰符使函数由 DLL 导出,以供其他应用程序。 当 MATHFUNCSDLL_EXPORTS 未定义时,MATHFUNCSDLL_API 定义了成员函数声明的 __declspec(dllimport) 修饰符。 此修饰符使编译器优化导入函数从 DLL 用于其他应用程序。 默认情况下,那么,当您的 MathFuncsDll 生成项目时,MATHFUNCSDLL_EXPORTS 定义。 有关更多信息,请参见dllexport, dllimport

    备注

    如果生成命令行上的 DLL 项目,请使用 /D 编译器选项定义 MATHFUNCSDLL_EXPORTS 符号。

  4. 解决方案资源管理器MathFuncsDll 项目,在 源文件 文件夹中,打开 MathFuncsDll.cpp。

  5. 在源文件中实现 MyMathFuncs 的功能。 代码应类似于:

    // MathFuncsDll.cpp : Defines the exported functions for the DLL application.
    //
    
    #include "stdafx.h"
    #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 invalid_argument("b cannot be zero!");
            }
    
            return a / b;
        }
    }
    
  6. 通过选择 生成生成动态链接库,在菜单栏上的 生成解决方案

    备注

    如果您使用不显示一个 生成 菜单上,在菜单栏上的一个学习版,选择 工具设置专家设置 启用它,然后选择 生成生成解决方案

    备注

    如果生成在令行生成项目,请使用 /LD 编译器选项指定输出文件是 DLL。有关更多信息,请参见/MD、/MT、/LD(使用运行库)。使用 /EHsc 编译器选项可启用 C++ 异常处理。有关更多信息,请参见/EH(异常处理模型)

创建引用 DLL 的应用程序

  1. 若要创建将引用,并使用 DLL 在菜单栏上,创建的 c. c++ app,选择 文件新建项目

  2. 在左窗格中,单击 **Visual C++**下,选择 win32

  3. 在中间窗格中,选择 Win32 控制台应用程序

  4. 为项目指定名称 (例如," MyExecRefsDll 在 名称 框。 在 解决方案旁边,选择 添加到解决方案 从下拉列表。 这将新项目添加到包含 DLL 的解决方案。 选择**“确定”**按钮。

  5. Win32 应用程序向导 对话框的 概述 页上,选择 下一个 按钮。

  6. 应用程序设置 页上,在 应用程序类型下,选择 控制台应用程序

  7. 应用程序设置 页上,在 其他选项下,清除 预编译头 复选框。

  8. 选择 完成 按钮创建项目。

使用从选件类库功能。app

  1. 在创建一个控件个应用程序后,空程序创建您的。 名称为源文件是否与您先前选择的名称。 在本示例中,名为“MyExecRefsDll.cpp”。

  2. 若要使用在该应用程序在 DLL 创建的算术例程,则必须引用它。 为此,请选择 MyExecRefsDll 项目在 解决方案资源管理器,然后在菜单栏上,选择 项目引用。 在 属性页 对话框中,展开 通用属性 节点,选择" 框架和引用,然后选择 添加新引用 按钮。 有关**“引用”**对话框的更多信息,请参见“<Projectname> 属性页”对话框 ->“通用属性”->“框架和引用”

  3. 添加引用 对话框中可以引用的库。 它们包含的 项目 选项卡列出了当前解决方案中的项目和所有库。 在 项目 选项,请在 MathFuncsDll 旁边的复选框,然后选择 确定 按钮。

  4. 若要引用 DLL 的标头文件,必须修改包含的目录路径。 为此,请在 属性页 对话框中,展开 配置属性 节点,展开 C/C++ 节点,然后选择 常规。 在 附加包含目录旁边,请指定 MathFuncsDll.h 标头文件位置的路径。 您可以使用一个相对路径 (例如,。\ MathFuncsDll\—然后选择 确定 按钮。

  5. 现在即可在此应用程序中使用 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;
    
        try
        {
            cout << "a / 0 = " <<
                MathFuncs::MyMathFuncs::Divide(a, 0) << endl; 
        }
        catch (const invalid_argument &e) 
        {
            cout << "Caught exception: " << e.what() << endl; 
        }
    
        return 0;
    }
    
  6. 通过选择 生成生成可执行文件,在菜单栏上 生成解决方案

运行应用程序

  1. 确保选择" MyExecRefsDll "作为默认值项。 在 解决方案资源管理器,选择" MyExecRefsDll,然后在菜单栏上,选择 项目设为启动项目

  2. 若要运行项目,在菜单栏上,选择 调试开始执行 (不调试)。 输出应该与下面的内容类似:

+ b = 106.4 a 到 b = -91.6 * 732.6 = a b/b = 0.0747475 捕获异常:b 不能为零!

后续步骤

上一部分:在Visual C++的DLL |下一部分: 如何:创建类库

请参见

任务

Visual C++ Guided Tour

Walkthrough: Deploying Your Program (C++)

概念

在Visual C++的DLL

从 Visual Basic 应用程序调用 DLL 函数

其他资源

部署的桌面应用程序(Visual C++)