Delphi以静态或动态方式链接到windows dll

tje*_*nks 1 windows delphi dll dynamic-linking static-linking

我知道在加载时隐式链接到库可能会导致性能提升,因此我想知道在编译时以这种方式链接是否是一种好的做法,从而增加可执行文件大小(不可否认,这只是边际)与明确链接相比在运行时.我的问题是,当链接到位于System32中的Microsoft Windows DLL文件时,在加载时链接是否"更好",因为您可以确定库存在或遵循显式方法?

使用的语言是Delphi(pascal),有问题的库是WTsAPI32.dll - 终端服务.

编辑:正如所指出的那样 - 我选择的语言不正确并且已经修改.另外,由于在Unix中只有每一个与库有很多链接,我对可执行文件大小的评论可以省略,我当时认为我实际上是指静态链接将库代码捆绑到可执行文件中,我现在意识到这一点使用dll文件时是不可能的(DUH!).谢谢大家.

Dav*_*nan 5

这两种形式的DLL链接可能更好地命名为隐式和显式.隐式链接就是你所说的静态链接.显式链接就是你所说的运行时链接

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

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

我的建议如下:

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

您特别提到了Windows DLL.你可以放心地假设他们会在场.不要尝试编写代码以允许您的程序运行,以防user32.dll丢失.旧版Windows中可能不存在某些功能.如果您支持这些旧版本,则需要使用显式链接并提供后备.确定您支持的版本并使用MSDN确保您的最低支持平台上有可用的功能.