如何使用dll

How to use a dll

我最近在尝试使用 gdi+ 时感到非常困惑,因为 sdk 文件只有三个文件,其中一个是 .dll 文件。我假设我需要加载 dll,因为我从来没有被教导或接触过这样的东西,不用说我很困惑。 (现在看来安装时也将 gdi+ sdk 文件放在 VS 查找标准文件的文件夹中(通过 <> 包含的东西,但仍然让我对 dll 在那里做什么一无所知)。

我研究并得到了一个似乎暗示以下内容的解释:

.dll 文件是一种代码在执行时加载到内存中的文件,通过指针引用内存而不是像标准库加载那样复制代码来节省时间。这也允许在不更改可执行文件的情况下更改 dll 的多功能性。

要使用它,您必须使用 loadlibrary,然后使用 getprocaddress 来基本上获取指向 specific 元素的指针(或其他东西,我不清楚),例如class 或函数,在 dll 中。

你看,我的印象是库基本上是你要重用的代码,相同的概念,但更有效的形式是简单地制作有用方法的 .cpp 文件和 class es 然后包括它们。

据我所知,这个假设是不正确的,如果愿意,我希望了解这个 .lib 和 .dll 库内容的人来解释一下。

请记住,我目前对 dll 或 lib 目的的理解是重用代码。使用 classes 和方法创建一个文件,然后将其导入即可使用。从这个意义上说,我对图书馆极度缺乏经验。

要使用 DLL,您:

  1. #include编译时的头文件
  2. 在 link 进程中包含 .lib 文件('implib'),以便 linker 知道符号是在运行时从 dll 中获取的.
  3. 安排 .dll 文件出现在 PATH 环境变量中包含的目录中。

请注意,在某些版本的 Windows 中,由于 SxS 方面的考虑,此过程很复杂,您将需要一个清单。你可以自己去查SxS和相关的问题。

如您所说,.dll 和 .lib 是重用代码的选项。 .dll 称为动态库,因为该库是在运行时加载的,而 .lib 是静态库,在编译时加载并放入您的程序中。我知道使用这些库的三个选项:

  • 你直接使用.dll,就是用LoadLibrary()把.dll加载到内存,然后用GetProcAddress得到一个函数指针(基本上是一个变量中的内存地址,但是你可以像使用函数一样使用它)。这里的问题是:您需要知道函数的错位名称(错位 = 编译器为函数重载和类似生成的唯一名称)并且您需要知道函数参数和 return 值。
  • 您使用静态库 (.lib)。这意味着您将库的头文件包含到您的项目中,它告诉您的编译器函数名称(没有修改)、它们的参数和 return 值,就像您对在不同 .cpp 文件中定义的函数所做的那样.但是随后库的代码被复制到你的程序中,这增加了它的大小,如果库被更新,你必须重新编译你的程序。
  • 一些 SDK 包括预构建(或容易构建的)静态库文件 (.lib),这些文件实际上只包含存根代码,然后在程序开始时加载包含实际代码的 .dll。这将为您提供两种可能性中最好的,因为您根本不必在运行时加载库的同时弄乱 name-mangling/function 指针。这也意味着您只需在库的 API(=header)更改后重新编译程序。
  • 此列表中第一个示例中涉及的步骤可以由主机操作系统处理:如果您的编译器很聪明,它可以检测到您正在调用的外部函数并直接在 "Import Table" 中声明它们在你的输出 executable 文件中。当 OS 加载您的程序时,它可以 link-up 为您导入 table - 这确实会减慢程序加载时间(如果从未调用某些函数可能会浪费时间) - 或者导致如果在硬盘上找不到依赖文件,程序将不会加载(而如果你使用 LoadLibrary 你可以优雅地失败),但它确实大大减轻了程序员的负担。
  • 还有COM(或CORBA),可以看作是本列表第一个例子的扩展; COM 允许公开和导出整个对象,而不仅仅是自由函数。这是一种强大的方法,可以实现可重用的用户界面小部件和数据库访问代码等功能。缺点是组件容器 DLL 必须符合定义的应用程序二进制接口,并且需要大量的跑腿工作和其他文件,如 IDL(接口定义语言)。
    • 旁注:Java 和 CLR 等运行时为组件提供了一种类似于 COM 的方式来声明 类 及其包含的组件,并允许其他程序在以下位置引用和使用这些对象没有任何编译时 linking 的运行时。 Microsoft Windows 8.0(及更高版本)使用 "Windows Runtime" 将此方法推广到更多 executable 二进制类型,其中一个简单的元数据文件 (.winmd) 本质上用作一种"export list"。它可以被认为是一种 "COM on Steroids" 或 "COM for the 21st Century" 如果你觉得刻薄。