gpt4 book ai didi

windows - Delphi静态或动态链接到windows dll

转载 作者:可可西里 更新时间:2023-11-01 10:56:14 27 4
gpt4 key购买 nike

我知道在加载时隐式链接到库可以提高性能,因此我想知道在编译时以这种方式链接是否是一种好的做法,从而增加可执行文件的大小(诚然这只是边际)相比在运行时显式链接。我的问题是,当针对位于 System32 中的 Microsoft Windows dll 文件进行链接时,在加载时进行链接是否“更好”,因为您几乎可以确定库将存在或遵循显式方法?

使用的语言是 Delphi (pascal),相关库是 WTsAPI32.dll - 终端服务。

编辑:正如所指出的那样 - 我选择的语言不正确并且已被修改。此外,由于在 Unix 中只有真正广泛链接到库,我关于可执行文件大小的评论可以省略,我相信当时我实际上指的是静态链接,它将库代码捆绑到可执行文件中,我现在意识到这一点使用 dll 文件时是不可能的(DUH!)。谢谢大家。

最佳答案

将 DLL 链接的两种形式命名为隐式和显式也许更好。隐式链接就是您所说的静态链接。显式链接就是您所说的运行时链接

对于隐式链接,链接器将条目写入可执行文件的导入表。此导入表是加载程序用来在模块加载时解析 DLL 导入的元数据。每个只有几个字节大小的隐式导入都包含一个 stub 函数。隐式链接对可执行文件大小的影响可以忽略不计。

通过显式链接,导入函数的地址通过调用 GetProcAddress 来解析。这个调用是在程序员选择时进行的。如果无法解析 DLL 或函数,程序员可以编写回退行为代码。我估计与隐式链接类似的显式链接有大小影响。如果函数地址被评估一次并在调用之间被记住,那么性能特征类似于隐式链接。

我的建议如下:

  1. 更喜欢隐式链接。编码更方便。
  2. 如果 DLL 可能不存在,请使用显式链接。
  3. 如果必须使用完整路径加载 DLL,请使用显式链接。
  4. 如果要在程序执行期间卸载 DLL,请使用显式链接。

您特别提到了 Windows DLL。您可以放心地假设它们会出现。不要尝试编写代码以允许您的程序在缺少 user32.dll 的情况下运行。某些功能可能不存在于旧版本的 Windows 中。如果您支持那些旧版本,您将需要使用显式链接并提供回退。确定您支持的版本并使用 MSDN 来确保某个功能在您支持的最低平台上可用。

关于windows - Delphi静态或动态链接到windows dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17726488/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com