首页 > 系统相关 >Windows环境下,动态链接库(DLL)的“导入”与“导出”概念

Windows环境下,动态链接库(DLL)的“导入”与“导出”概念

时间:2024-12-07 16:43:18浏览次数:2  
标签:__ 函数 Windows 导出 DLL int 导入 动态链接库

在软件开发中,特别是在使用动态链接库(DLL)的Windows环境下,"导入"(Import)和"导出"(Export)是两个关键概念,用于管理函数和变量在DLL之间的可见性和可用性。

导出 (Export)

当你创建一个DLL时,你可能会希望在这个DLL中定义一些函数或变量,使得其他的程序(客户端程序)或者其他的DLL能够调用或访问这些函数或变量。为了使这些函数或变量能够被外部访问,你需要在DLL项目中将它们"导出"。

如何导出:在Windows平台上,通常使用__declspec(dllexport)关键字来标记那些需要被导出的函数或变量。这个关键字告诉编译器和链接器,这些函数或变量应该在DLL的导出表中可见,从而允许外部程序链接并使用它们。

导入 (Import)

当其他程序或DLL需要使用一个已经被导出的函数或变量时,它们需要将这些函数或变量"导入"到自己的代码中。

如何导入:在Windows平台上,通常使用__declspec(dllimport)关键字来标记那些需要从其他DLL导入的函数或变量。这个关键字告诉编译器和链接器,这些函数或变量是在另一个外部DLL中定义的,因此在链接时需要处理这些外部引用。

示例

假设你有一个DLL,名为MyLibrary.dll,它提供了一个函数int add(int, int)。要在这个DLL中导出这个函数,你会这样写:

 

// MyLibrary.cpp
__declspec(dllexport) int add(int a, int b) {
    return a + b;
}

然后,如果另一个程序想要使用这个add函数,它需要将这个函数导入:

// ClientProgram.cpp
__declspec(dllimport) int add(int a, int b);

int main() {
    int result = add(5, 3);
    return 0;
}

为什么使用导入/导出

使用导入和导出的主要原因是效率和模块化:

  • 模块化:DLL允许你将代码分割成独立的模块,每个模块可以独立开发和更新,只要接口保持不变,不会影响使用它的程序。
  • 内存和资源效率:当多个程序使用同一个DLL时,操作系统可以让这些程序共享同一份DLL副本的代码和数据,减少内存使用和提高加载效率。

这种机制是Windows操作系统中实现动态链接的基础,允许软件系统具有更好的扩展性和维护性。

 典型应用

这部分代码是一个典型的宏定义模式,用于控制在 Windows 平台上 DLL 的导入和导出。

#if defined(_MSC_VER)
# if defined(DLLBUILD)
/* define DLLBUILD when building the DLL */
#  define MODBUS_API __declspec(dllexport)
# else
#  define MODBUS_API __declspec(dllimport)
# endif
#else
# define MODBUS_API
#endif
  • #if defined(_MSC_VER):检查是否在 Microsoft Visual C++ 编译器环境中编译。
  • #if defined(DLLBUILD):如果定义了 DLLBUILD,则表示正在构建 DLL,因此使用 __declspec(dllexport) 来导出函数。
  • 如果没有定义 DLLBUILD,则使用 __declspec(dllimport) 来导入函数。
  • 如果不是在 Microsoft Visual C++ 环境中,MODBUS_API 宏被定义为空,这意味着导入导出声明对非 MSVC 编译器无效。

这种模式允许在同一代码基础上灵活地处理函数的导入和导出,特别是在跨平台项目中非常有用。

标签:__,函数,Windows,导出,DLL,int,导入,动态链接库
From: https://www.cnblogs.com/suphgcm/p/18592359

相关文章

  • 在虚拟机中部署Windows server系统
    本文章讲述的是虚拟化平台部署Windowsserver(参照虚拟化平台为Fusioncomputer)系统版本Windowsserver2019首先找到首页中的创建虚拟机进入创建新虚拟机下一步点击名称可以设置自己想要的名称可以是中文也可以是英文描述可以为了方便以后自己认识到这个虚拟机的用途(虽......
  • .cmd 文件用于 Windows NT 系列(如 Windows XP、Windows 7、Windows 10 和 Windows 11
    .cmd文件与.bat文件看似相似,都是用于在Windows操作系统中自动化执行一系列命令的批处理文件,但它们之间还是存在一些细微的区别。以下是.cmd文件与.bat文件的详细对比:1. 命令解释器的不同.bat 文件:使用较早的命令解释器 command.com(在Windows95和更早版本中)。com......
  • Windows 的环境变量
    环境变量的介绍Windows的环境变量专门用来记录路径,路径存储在环境变量的Path中.如果希望某一个文件在CMD窗口的任意路径下都可以打开,则需要将该文件的路径存放在环境变量中.一般我们配置Path环境变量的目的都是希望可以在任意目录下打开指定的软件.在CMD中运行该......
  • 戴尔Inspiron 14 Plus 7430系统:Windows 11 家庭中文版(吐槽专区)
    真是这个电脑是我用过的最垃圾的!!!真是绝了。首先把我遇到的问题发一下,哪位大神如果知道处理,帮忙回复一下。问题一:java运行Helloworld都报错JDK环境我从21换成了17的不知道是不是这个这个原因引起的问题2:jmeter运行脚本报错(在别人电脑上是好的别人用的win10)取样器明明已......
  • powershell遍历注册dll
    #设置要遍历的根文件夹路径,你可以根据实际情况修改这个路径$rootFolder="C:\script\dlls"#获取该文件夹及其子文件夹下所有的.dll文件$dllFiles=Get-ChildItem-Path$rootFolder-Filter"*.dll"-Recurse#遍历每个找到的.dll文件并尝试注册foreach($dllFilein$dllFi......
  • 《鸣潮》进入游戏后弹窗“错误代码[126]:加载 x3daudio1_7.dll 失败,该文件缺失或损坏!
     《鸣潮》进入游戏后弹窗“错误代码[126]:加载x3daudio1_7.dll失败,该文件缺失或损坏!”是什么原因?“x3daudio1_7.dll文件缺失”要怎么解决?作为一位软件开发从业者,深知电脑游戏运行过程中可能会遇到的各种问题,其中文件丢失、文件损坏和系统报错尤为常见。最近,不少《鸣潮》......
  • 【TFTP文件传输,开发板与windows文件互传, SecureCRT中使用TFTP】
    目录列表一、从window下发送文件到板端挂载SD卡:启动板端服务器:windows中启动TFTP客户端单个文件发送:window中tftp命令:从当前本机,向远端192.168.1.27中发送C:\Users\Administrator\Downloads\test.wav文件使用bat脚本多文件发送:(注意检查更换目标IP地址、本地路径、......
  • 解决《杏林物语》DLL错误:使用DirectX修复工具轻松搞定!
    《杏林物语》是一款深受玩家喜爱的模拟经营游戏,但最近不少玩家遇到了DLL错误,严重影响了游戏体验。幸运的是,通过使用DirectX修复工具,你可以轻松解决这些问题,重新享受游戏的乐趣。操作步骤:1.下载DirectX修复工具:•访问官方网站或其他可信来源,下载最新版本的DirectX修复工具。......
  • 【windows系统】域账户跳过管理员权限安装软件或卸载软件的方法(更改UAC设置)
    域账户跳过管理员权限安装软件或卸载软件的方法可能有很多种,本次采用设置域账户UAC(用户账户控制)权限的方式来进行操作。问题演示普通域账户安装软件或者更改计算机的某些设置的时候,会出现一些让输入管理员账号密码之类的提示,非常不便捷。那么有什么办法可以绕过这一步操作呢?(......
  • 电脑提示msvcp100.dll丢失修复怎么修复,多种修复方法分享
    msvcp100.dll是一个MicrosoftVisualC++的动态链接库(DLL)文件,它是MicrosoftVisualC++2010RedistributablePackage的一部分。这个文件包含了C++标准库的实现,为使用MicrosoftVisualC++2010编译器编译的应用程序提供了运行时所需的核心功能。功能和作用msvcp100.dll文......