这些何时加载 DLL:隐式链接 VS 显式链接

2023-11-26

我认为隐式链接会在应用程序启动时立即加载 DLL,因为它也称为“加载时动态链接”。但我从这里的链接中发现了下面一些奇怪的解释(https://msdn.microsoft.com/en-us/library/253b8k2c(VS.80).aspx).

隐式链接

与程序代码的其余部分一样,DLL 代码也被映射到地址 进程启动并加载时的进程空间 仅在需要时才记忆。因此,PRELOAD 和 LOADONCALL 代码 .def 文件使用的属性来控制以前版本中的加载 Windows 不再具有意义。

显式链接

隐式链接到许多 DLL 的应用程序可能会很慢 启动,因为 Windows 在应用程序加载时加载所有 DLL。 为了提高启动性能,应用程序可以隐式链接到 那些加载后立即需要并等待显式调用的 DLL 需要时链接到其他 DLL。

以及来自此处的隐式链接的另一种解释(https://msdn.microsoft.com/en-us/library/151kt790.aspx).

隐式链接

Visual C++ 链接器现在支持 DLL 的延迟加载。这 使您无需使用 Windows SDK 函数 LoadLibrary 和GetProcAddress实现DLL延迟加载。

在 Visual C++ 6.0 之前,在运行时加载 DLL 的唯一方法是通过 使用 LoadLibrary 和 GetProcAddress;操作系统将加载 加载可执行文件或使用它的 DLL 时的 DLL。

从 Visual C++ 6.0 开始,当静态链接 DLL 时, 链接器提供延迟加载 DLL 直到程序调用的选项 该 DLL 中的函数。

应用程序可以使用/DELAYLOAD(延迟加载 导入)带有辅助函数的链接器选项(默认实现 由 Visual C++ 提供)。辅助函数将在运行时加载 DLL 打电话的时间加载库 and 获取进程地址为你。

我真的很困惑,不知道如何理解这些。

1.隐式链接是在启动时加载DLL还是仅在调用DLL中的函数时加载?

2. 这意味着两者最终是相似的,因为 LoadLibrary() 是在后台调用的?


@remy-lebeau 在他的评论中提供了很好的解释。我将尝试在这里详细说明作为答案。

隐式和显式dll加载之间的区别解释here。 简而言之:

  • In 显式加载,应用程序通过显式调用 LoadLibrary 来加载 dll。
  • In 隐式加载,应用程序在编译时指定dll,Windows加载程序在运行时加载它。

隐式加载有很多优点,但它会减慢应用程序加载时间,因为所有 dll 都会在此阶段加载。

为了解决这个问题,微软支持延迟加载的DLL,这是一个隐式加载类型.

通过使用它,您可以享受隐式加载的所有好处,但只有当您的应用程序调用其函数之一时,DLL 才会被加载。

对于您的问题:

  1. 在隐式加载中,如果您没有将其指定为延迟加载,则 dll 将在应用程序启动时加载。如果您这样做了,它将在第一次使用时加载。
  2. 是的。在所有情况下,dll 都会被加载并映射到应用程序内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这些何时加载 DLL:隐式链接 VS 显式链接 的相关文章

  • 如何在 C++ 中对四元结构进行有效排序?

    我有一个包含 x y z 和 w 成员的结构 如何高效排序 在 C 中首先按 x 然后按 y 按 z 最后按 w 如果你想实现字典排序 那么最简单的方法是使用std tie实现小于或大于比较运算符或函子 然后使用std sort http
  • 枚举 EMF 时丢失文本

    我在列举发票 emf http www mediafire com kdjwvvo7odyvwa6并将其复制到另一个但文本丢失了 令人惊讶的是 当我将其输出到窗口时 它绘制得非常完美 int CALLBACK EnhMetaFileProc
  • 使用 strcpy 从整数生成指针,无需进行强制转换

    我不明白我做错了什么 我正在学习 C 很抱歉 如果这显然是错误的 但我正在尝试使用uthash http uthash sourceforge net 制作股票及其价格的哈希图 但是当我将股票添加到哈希映射时 我收到上述错误 我所做的就是从
  • 如何通过实体键添加/删除与实体框架的多对多关系?

    I tried using Entities e new Entities EntityKey key new EntityKey Entities Users UserId 20 User user new User EntityKey
  • 在 PHP 扩展中,推荐从 std::string 返回值的方法

    我们有一个简单的 PHP 函数 其目的是调用 C 自由函数std string callLibrary std string 并返回其std string返回值 目前看起来是这样的 PHP FUNCTION call library cha
  • 如何有效地左填充字节数组

    假设我有一个数组 LogoDataBy byte 0x00000008 0x00000000 0x41 0x00000001 0x42 0x00000002 0x43 0x00000003 0x44 0x00000004 0x31 0x00
  • 如何在Qt3D中优化点云渲染

    我正在尝试使用 Qt3D 显示大型点云 20M pts 我第一次发现这个图书馆https github com MASKOR Qt3DPointcloudRenderer https github com MASKOR Qt3DPointc
  • 为什么数组不可赋值? [复制]

    这个问题在这里已经有答案了 据我所知 C 标准禁止使用数组作为可修改的左值 即在赋值的左侧 int lhs 4 rhs 4 0 1 2 3 lhs rhs illegal 现在 我一直想知道为什么会这样 我可以看到上面的语句 以及写入数组的
  • 如何在方法模板中使用模板类型的引用传递参数?

    我目前正在努力编译以下代码 首先是包含带有方法模板的类的头文件 ConfigurationContext h class ConfigurationContext public template
  • 如何获取 PropertyGrid 的单元格值 (c#)?

    如何在 C 中获取属性网格项和项的值 例如 Name Ali LastName Ahmadi Name 和 LastName 是 propertygrid 的 2 个属性 PropertyGrid只是对象的组件模型表示的视图 我会说 查看组
  • 会员提供商使用还是不使用?

    我正在开发一个使用 Facebook 的网站 现在为了管理用户我想使用MembershipProvider并选择开发一个定制的会员提供商 我的问题是我的数据库架构与标准成员资格架构不匹配 并且提供的用于覆盖的函数采用与我预期不同的参数 例如
  • Apple IOS 上的 C# 应用程序 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有基于 C Net 的应用程序 有什么方法可以在 Apple IOS 上运行这些应用程序吗 我没有资
  • 使用 c# 中的 c++ ref 中的引用从 C# 调用 C++ 代码错误

    所以在我的 c dll 文件中我得到了以下函数 DLL void GetUserPass char userName char passWord userName ceva passWord altceva 现在我想从 c 调用它 但它给了
  • C# 的 user32 和内核方法列表 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有一个很好的清单来说明我们可以从中进口什么user32 dll and kernel dll并在 C 中使用 我是 Windows A
  • cmake 包括其他目录中的 h 文件

    我在 cmake 项目下进行测试时遇到问题 我的项目是这样安排的 TerrainMap PointAccumulator heightQuadGrid Test 在 TerrainMap 目录中 CMakeLists txt 文件简单地概述
  • Sharepoint 的 CAML 查询中的日期时间比较

    我正在尝试从共享点列表中获取某些项目 具体取决于自定义列中的日期 我已经使用 U2U Caml Builder 创建了查询 这很有效 但是当我将其放入 Web 部件中自己的代码中时 它总是返回列表中的所有项目 这是我的代码 DateTime
  • 如何重写(重新实现)QFileSystemModel 中的成员函数

    我已经为此苦苦挣扎了一段时间 Qt s QFileSystemModel由于图标获取算法非常糟糕 在获取数百个文件时速度非常慢 我想完全禁用图标 它们被提取到QFileSystemModel data方法不是虚拟的 QFileSystemM
  • Opencv 对象检测:ORB GPU 检测器和 SURF GPU 描述符提取器

    我只是做了一个小实验来尝试不同的检测器 描述符组合 我的代码使用 ORB GPU 检测器来检测特征 并使用 SURF GPU 描述符来计算描述符 我使用 BruteForceMatcher GPU 来匹配描述符 并使用 knnMatch 方
  • 创建进程的多个子进程并维护所有 PID 的共享数组

    我已经分叉了几次 并用 C 创建了一堆子进程 我想将它们所有的 PID 存储在一个共享数组中 PID 的顺序并不重要 例如 我创建了 32 个进程 我想要一个 32 个整数长的数组来存储每个 PID 并且每个进程都可以访问 最好的方法是什么
  • 如何在 C# 中将 json 转换为平面结构

    我正在尝试用 C 编写函数 将 JSON 转换为键 值对 它应该支持数组 例如下面的 JSON title title value components component id id1 menu title menu title1 tit

随机推荐