【问题标题】:What's the purpose of the Direct3D import libraries? [closed]Direct3D 导入库的用途是什么? [关闭]
【发布时间】:2013-03-20 01:38:21
【问题描述】:

据我了解,这些库通常通过显式运行时链接 (LoadLibrary) 链接,但仍有一些导入库包含库的一小部分的描述符。这是什么原因?

提前致谢和问候!

【问题讨论】:

  • 我认为,它是用来知道那些dll中函数的地址,就像它们是函数入口点地址映射
  • 但这不是显式运行时链接所必需的。
  • @Skeptiker 如果您仅使用纯显式运行时链接(LoadLibrary,然后 GetProcAddress 并通过函数指针调用每个函数调用),那么您是对的,没有理由链接到库(对于调用函数)
  • 易于使用和安全。许多实用程序库(例如 D3DX 和 D3DCompiler)现在使用版本控制,这些库将自动考虑,但 LoadLibrary 不会。除非您有充分的理由(例如多个渲染后端),否则您应该使用库(其中包含 COM 对象的全局接口),而不是 LoadLibrary
  • @Necrolis 这可以解释很多!好点!

标签: c++ winapi dll com directx


【解决方案1】:

“导入库”就是:包含要在 DLL 中调用的真实函数地址的小存根。 这是一篇很棒的帖子,解释了why you need import libraries 您可能还想了解链接在 Windows 世界中的工作原理on the same (great) blog

如果您对故事的另一端(执行时间)感到好奇,有一些很棒的文章介绍了 Windows 如何加载所需的 DLL,对于 example on MSDNherehere,这对了解您的程序为什么/如何不(直接)调用 LoadLibrary

当您使用来自另一个 DLL 的代码或数据时,您就是在导入它。当任何 PE 文件加载时,Windows 加载器的工作之一就是定位所有导入的函数和数据,并使这些地址可用于正在加载的文件。

加载器会根据链接器在 IAT 中写入的内容为您加载 DLL
(有一篇关于NT Insider的更有趣的文章,但我在网上找不到。

它们的存在是为了“让链接器满意”,提供仅(曾经)不存在于 DLL 中的信息。

【讨论】:

  • 感谢您的努力,但这似乎并没有解决我的问题。也许最后一句话是为了做到这一点,但是它非常模糊。导入库仅包含库功能的一小部分。
  • 嗯...让我澄清一下。您通常不直接使用 LoadLibrary,而是链接到存根,这些存根是仅包含用于定位函数的信息的小库。链接器需要它们来解析函数名称,并将信息放入稍后将由操作系统使用的 EXE 中。然后操作系统(特别是加载程序)为您加载 DLL。
  • 此外,库是符号和代码的通用容器:它们只是捆绑在一起的一堆 .obj 文件(编译的 .cpp 文件)。所以你有函数和全局常量。 IIRC,DirectX 也为此目的使用库:定义常量,稍后由您的应用程序使用。 CAPS 和设备 ID 就是一个例子(同样是 IIRC)
  • 不,不需要导入库,并且与 LoadLibrary 显式运行时链接是常见的做法。
  • @Skeptiker 与 LoadLibrary 的显式运行时链接不需要导入库 -> true。 “是常见的做法”......不是真的。为什么会这样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
相关资源
最近更新 更多