C++ 中动态链接库–导入和导出的实例详解

C++ 中动态链接库--导入和导出的实例详解

动态链接库

动态链接库(Dynamic Link Library,简称 DLL)是一种共享库,可以在多个不同的应用程序中被使用,从而达到代码共享与节约程序的空间资源的目的。在C/C++ 中,链接器需要将每一个源文件的目标文件抽出来并重新组合成一个大的目标文件,该目标文件包含了完整代码,因此容易造成代码浪费和可执行程序文件过于庞大的问题。而使用动态链接库则可以很好地解决这些问题。

动态链接库的优点

  1. 程序模块化,容易维护,代码相互独立,便于分工协作开发。
  2. 能够共享代码,使程序更加轻巧,节省了硬盘空间和内存资源。
  3. 便于程序升级,只需将 DLL 文件替换即可,不影响主程序。
  4. 提高应用程序的运行速度,因为程序优先调用 DLL 文件中已编译好的函数代码,而不是自己编写的代码。

动态链接库的导入和导出

对于 DLL 文件,它有两种角色:导入库和导出库。导入库(.lib文件)是给应用程序使用的而导出库(.dll文件)是给程序员写 DLL 的时候使用的。导入库可以理解为使用 DLL 的“中介”,它负责维护和调用 DLL 函数的地址等信息,而导出库则负责将 DLL 中的函数暴露出来让外部使用。

导出例子

首先,我们需要定义一个导出函数,在 C++ 中则采用 extern "C" 关键字来指定导出函数的 C++ 风格(即取消了函数名的名称修饰),代码示例如下:

#ifdef EXPORTS
#define EXPORT_API extern "C" __declspec(dllexport)
#else
#define EXPORT_API extern "C" __declspec(dllimport)
#endif

EXPORT_API int add(int a, int b)
{
  return a + b;
}

该代码指定了导出函数 add,并且在 DLL 中使用 __declspec(dllexport) 来使其暴露。同时用 __declspec(dllimport) 来引用导出函数。

导入例子

然后我们需要编写一个测试程序来使用导出函数,代码示例如下:

#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
  HINSTANCE hDll = LoadLibrary(TEXT("MyMathDLL.dll"));
  if (hDll)
  {
    FARPROC pAdd = GetProcAddress(hDll, "add"); //获取导出函数
    if (pAdd)
    {
      int a = 3;
      int b = 5;
      int c = ((int (__cdecl *)(int, int))pAdd)(a,b); //调用导出函数
      cout<<"a + b = "<<c<<endl;
    }
    else
      cout<<"Function add not found"<<endl;
    FreeLibrary(hDll);
  }
  else
    cout<<"Load DLL failed"<<endl;
  return 0;
}

该代码使用 LoadLibrary 函数加载 DLL,并使用 GetProcAddress 函数获取 DLL 中指定的导出函数 add。在获取到导出函数之后,通过强制转换成指针的方式来使用导出函数。最后,在使用完导出函数后,使用 FreeLibrary 函数将 DLL 卸载,释放内存空间。

以上就是使用 C++ 实现 DLL 中导入和导出的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 中动态链接库–导入和导出的实例详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Win11安装完要账号密码怎么办 ?Win11装完系统要用户密码登录解决方法

    Win11安装完系统后,需要设置用户账号密码才能登录系统。如果忘记了设置的账号密码,或者想要取消账号密码登录,可以按照以下方法进行操作: 方法一:取消账号密码登录 打开“运行”(快捷键为win+R),输入“netplwiz”并按下Enter键。 在“用户账户”窗口中,取消勾选“要使用该计算机,用户必须输入用户名和密码”选项。 点击“确定”按钮,输入当前设置的…

    other 2023年6月27日
    00
  • java实现中缀表达式转后缀的方法

    Java实现中缀表达式转后缀的方法 中缀表达式是我们常见的数学表达式形式,例如2 + 3 * 4。而后缀表达式(也称为逆波兰表达式)是一种将操作符放在操作数之后的表达式形式,例如2 3 4 * +。在计算机科学中,我们通常将中缀表达式转换为后缀表达式,以便更容易进行计算。 下面是一种使用Java实现中缀表达式转后缀表达式的方法: 步骤1:创建一个空的栈和一个…

    other 2023年8月6日
    00
  • java基于Apache FTP实现文件上传、下载、修改文件名、删除

    下面是详细讲解“Java基于Apache FTP实现文件上传、下载、修改文件名、删除”的完整攻略: 概述 Apache FTP是一个Java库,允许Java程序提供丰富的FTP客户端功能,如文件上传、下载、删除、重命名等。通过Apache FTP,Java程序能够连接到FTP服务器并执行这些FTP操作。在本文中,我们将学习如何使用Apache FTP实现文件…

    other 2023年6月26日
    00
  • Win10重启一直在转圈圈怎么办?Win10重启一直转圈圈的解决方法

    下面是详细讲解 Win10 重启一直转圈圈的解决方法: 1. 原因分析 Win10 重启转圈圈的原因可能有很多,但主要以下两点: Win10 系统启动文件损坏导致 Win10 系统驱动出问题 2. 解决方法 方法一:修复启动文件 首先进入开机启动菜单,按住 Shift 键再单击“重启” 进入“疑难解答”页面,选择“高级选项” 选择“命令提示符”,输入 boo…

    other 2023年6月26日
    00
  • ios:延时执行的三种方式

    iOS:延时执行的三种方式 在iOS开发中,我们经常需要延时执行一些代码,例如在用户点击按钮后延时执行某个操作,或者在某个时间点后执行某个操作。本文将提供一个完整攻略,介绍中延时执行的三种方式,并提供两个示例说明。 iOS中延时执行的三种方式 在iOS中可以使用以下三种方式现延时执行: NSTimer:NSTimer是iOS中的一个定时器类,可以用于定时执行…

    other 2023年5月8日
    00
  • 手把手教你在腾讯云上搭建hadoop3.x伪集群的方法

    下面就给大家详细讲解“手把手教你在腾讯云上搭建hadoop3.x伪集群的方法”。 前置条件 在开始本教程之前,需要先满足以下的前置条件: 已经注册了腾讯云账户并开通云服务器功能 熟悉基本的Linux命令和Hadoop知识 步骤一:创建腾讯云服务器 登录腾讯云控制台,选择云服务器 > 新建实例 在“基础设置”中,选择合适的地域、可用区、镜像类型和操作系统…

    other 2023年6月20日
    00
  • nginx配置ftp

    要在Nginx中配置FTP服务器,需要使用Nginx的ngx_http_core_module模块和ngx_stream_core_module模块。以下是使用Nginx配置FTP服务器的完整攻略: 首先,安装FTP服务器软件,例如vsftpd或proftpd。这里以vsftpd为例: bash sudo apt-get install vsftpd 然后,…

    other 2023年5月9日
    00
  • Lua在各个操作系统中的开发环境配置教程

    Lua在各个操作系统中的开发环境配置教程 Windows操作系统 在官网下载最新版的Lua安装包。 打开安装包,按照安装向导的提示进行安装。选择安装路径时,最好将路径添加到系统环境变量中,这样才能在任意文件夹中使用Lua命令。 安装完成后,在命令提示符中输入lua -v,如果提示Lua的版本信息,则证明安装成功。 推荐使用ZeroBrane Studio作为…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部