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日

相关文章

  • Android UI设计之AlertDialog弹窗控件

    Android UI设计之AlertDialog弹窗控件 在Android应用程序中,弹出式对话框是非常有用的。其中最常用的就是AlertDialog弹窗控件,因为它可以提示用户采取某项操作或提醒用户做什么。本文将介绍如何在Android应用程序中使用AlertDialog控件。 1. 显示AlertDialog 要显示AlertDialog控件,我们可以使…

    other 2023年6月26日
    00
  • python网络编程学习笔记(三):socket网络服务器

    这里给您详细讲解一下”Python网络编程学习笔记(三):Socket网络服务器”的完整攻略。 概述 在本文中,我们将学习如何使用Python编写一个基础的Socket网络服务器。Socket是TCP/IP协议的一个封装,我们可以使用Socket来进行网络通信。 功能需求 监听客户端的网络连接。当有客户端连接时,处理客户端的请求并向客户端发送响应数据。 实现…

    other 2023年6月27日
    00
  • 使用sqlserver中的float类型时发现的问题

    使用SQL Server中的Float类型时发现的问题 当我们在使用SQL Server数据库时,可能会用到浮点型数据类型,其中包括float和real两种类型。这些数据类型非常适合用于大型数据计算和科学计算。 然而,在使用SQL Server中的float类型时,需要注意一些问题。下面将介绍两个常见的问题和解决方案。 问题1:float类型的不准确输出 在…

    其他 2023年3月29日
    00
  • 详解aws免费服务器申请及网络代理搭建教程

    标题:详解AWS免费服务器申请及网络代理搭建教程 申请AWS免费服务器 首先创建AWS账号并登录AWS控制台,网址为:https://aws.amazon.com/cn/ 进入控制台后,选择“EC2”,在“EC2”页面中,可以看到“启动实例”按钮。点击该按钮开始创建免费服务器实例。 在“启动实例”页面中,选择“Amazon Linux 2 AMI (HVM)…

    other 2023年6月27日
    00
  • Python实现的FTP通信客户端与服务器端功能示例

    Python实现的FTP通信客户端与服务器端功能示例攻略 本攻略将详细讲解Python实现的FTP通信客户端与服务器端功能的实现过程。我们将分为以下几个部分进行讲解:1. 环境搭建2. FTP客户端功能 – 下载文件示例3. FTP服务器端功能 – 上传文件示例4. 总结 环境搭建 在进行FTP客户端和服务器端功能实现之前,我们需要搭建Python开发环境。…

    other 2023年6月25日
    00
  • 在ASP.NET 2.0中操作数据之五十二:使用FileUpload上传文件

    当我们需要在 ASP.NET 应用程序中实现文件上传时,可以使用 FileUpload 控件来方便地实现这一功能。下面将介绍在 ASP.NET 2.0 中如何使用 FileUpload 控件上传文件。 1. 创建页面和控件 首先,需要在 ASP.NET 页面中创建一个 FileUpload 控件以及一个 Button 控件用于触发上传事件。在 ASP.NET…

    other 2023年6月27日
    00
  • markdown怎么输入空格

    Markdown怎么输入空格 在Markdown中输入空格并不是一件直接和简单的事情,因为Markdown的语法规则需要通过一些特殊的方式来实现空格的输入。那么让我们来了解如何在Markdown中输入空格。 1. 使用HTML实体 Markdown支持HTML的部分标记语言,所以我们可以通过HTML中的实体表示法来输入空格。下面是一些常见的HTML实体: 实…

    其他 2023年3月28日
    00
  • 如何在python中声明数组?

    下面是关于“如何在Python中声明数组”的完整攻略,包括步骤和示例说明。 简介 在Python中,可以使用列表(List)来表示数组。列表是一种有序的集合,可以存储任意类型的,包括数字、字符串、布尔值等。 步骤 下面是声明数组的步骤: 使用方括号([])来表示一个列表。 在方括号中添加元素,用逗号(,)分隔。 示例说明 下面是两个示例说明,分别演示了如何在…

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