【问题标题】:DelayLoad different libraries with identical names延迟加载具有相同名称的不同库
【发布时间】:2021-06-16 20:55:09
【问题描述】:

我有以下场景:

可执行应用程序可以通过 dll 进行自定义,并且可以并行启动多个自定义项。对于常见任务,这些 dll 可以使用动态链接的开源库,例如 OpenSSL(libssl.liblibcrypto.lib,它们正在检索模块 libssl-1_1-x64。 dlllibcrypto-1_1-x64.dll)。

为了检索所需的库模块,它们与 /delayload 选项链接。但是,如果库具有相同的名称(例如,因为它们是同一库的不同版本),则第一个 LoadLibrary 将为所有库进行绑定。

在更抽象的描述中,以下场景将检索 lib1\lib.dlllib2\lib.dll,但它总是会从 调用功能>lib1\lib.dll,因为这个模块首先被检索到。

程序 - 加载 dll1.dll - 链接 /delayload lib1\lib.lib - 需要 lib1\lib.dll - 加载 dll2.dll - 链接 /delayload lib2\lib.lib - 需要 lib2\lib.dll

有什么方法可以影响 dll2.dll 的绑定,而不是使用GetProcAddress 来获取检索到的 dll?

【问题讨论】:

    标签: c++ dll lib delay-load


    【解决方案1】:

    有什么方法可以影响 dll2.dll 的绑定,而不是使用 GetProcAddress 来获取检索到的 dll?

    是的,有。您可以为每个负载使用单独的Activation Context,可以直接通过using the Activation Context API 手动手动,也可以使用清单。

    How can I specify that my DLL should resolve a DLL dependency from the same directory that the DLL is in?:

    一个客户的程序加载了两个 DLL,我们称它们为 A.DLLB.DLL这两个 DLL 都使用一个名为 C.DLL 的通用帮助 DLL。问题是这两个 DLL 想要使用C.DLL不同的不兼容版本 两个 DLL A.DLLB.DLL 位于不同的文件夹中,每个文件夹都有对应的C.DLL 的副本。

    ...

    客户希望有办法让A.DLLB.DLL 两个DLL 使用它们各自版本的C.DLL他们怀疑一些带有激活上下文和清单的魔法可能会解决问题,但他们没有专业知识来弄清楚到底是什么。

    ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 2020-01-12
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多