一、原理

1.DLL是一个包含可由多个程序同时使用的代码和数据的库。

2.DLL的优点

a.使用较少的资源

    当多个程序使用同一个函数库时,DLL可以减少在磁盘和物理内存中加载的代码的重复量。这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在windows操作系统上运行的程序。

b.推广模块式体系结构

    DLL有助于促进模块式程序的开发。这可以帮助开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。

c. 简化部署和安装

    DLL中的函数需要更新或修复时,部署和安装DLL不要求重新建立程序与该DLL的链接。另外,如果多个程序使用同一个DLL,那么多个程序豆浆从该更新或修复中获益。当使用定期更新或修复的第三方DLL时,此问题可能会更频繁地出现。

3. DLL链接方式

    当在应用程序中加载DLL时,可以使用两种链接方法来调用导出的DLL函数。这两种链接方法是加载时动态链接和运行时动态链接。

    在加载时动态链接中,应用程序像调用本地函数一样对导出的DLL函数进行显式调用。要使用加载时动态链接,在编译和链接应用程序是提供头文件和导入库文件,链接器将向系统提供加载DLL所需的信息,并在加载时解析导出的DLL函数的位置。

    在运行时动态链接中,应用程序调用LoadLibrary函数以在运行时加载DLL。成功加载DLL后,可以使用GetProcAddress函数获得要调用的导出的DLL函数的地址。在使用运行时动态链接时,无需使用导入库文件。

下面的列表说明了有关何时使用加载时动态链接以及何时使用运行时动态链接的应用程序条件:

    • 启动性能
      如果应用程序的初始启动性能很重要,则应使用运行时动态链接。
    • 易用性
      在加载时动态链接中,导出的 DLL 函数类似于本地函数。这使您可以方便地调用这些函数。
    • 应用程序逻辑
      在运行时动态链接中,应用程序可以分支,以便按照需要加载不同的模块。在开发多语言版本时,这一点很重要。

二、制作DLL

导出DLL函数

    要导出DLL函数,可以向导出的DLL函数中添加函数关键字,也可以创建块定义文件(.def)以列出导出的DLL函数。

1. 使用函数关键字

    声明导出的各个函数: __declspec(dllexport)

    声明使用导出的DLL函数: __declspec(dllimport)

    通常情况下,使用一个包含define语句和ifdef语句的头文件,以便分割导出入局和导入语句,分别使用于DLL的源程序中和客户端的源程序中。

    创建一个DLL(空项目),分别添加头文件和.cpp文件

    dll_sen.h文件    

    #ifndef _XX
    #define _XX

    extern "C" __declspec(dllimport) int add(int x,int y);

    #endif

     dll_sen.cpp文件    

    extern "C" __declspec(dllexport) int add(int x,int y)
    {
    return x+y;
    }

    生成解决方案,获得DLL,导入库和头文件,提交用户。

    注意:由于是在加载时动态链接,所以头文件处必须声明是dllexport,否则当做本地函数进行符号解析。 

2. 使用模块定义文件(.def)

    当使用模块定义文件时,不必向导出的 DLL 函数中添加函数关键字。在模块定义文件中,您可以声明 DLL 的 LIBRARY 语句和 EXPORTS 语句。

    dll_def.def文件 

    LIBRARY "dll_def"
    EXPORTS
                    add

    dll_def.cpp文件

    int add(int x,int y)
    {
     return x+y;
    }

    dll_def.h文件

    int add(int x,int y);