微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

延迟加载具有相同名称的不同库

如何解决延迟加载具有相同名称的不同库

我有以下场景:

可执行应用程序可以通过 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,因为这个模块首先被检索。

prog.exe
  - loads dll1.dll
    - linked /delayload lib1\lib.lib
      - requires lib1\lib.dll
  
  - loads dll2.dll
    - linked /delayload lib2\lib.lib
      - required lib2\lib.dll

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

解决方法

有什么方法可以影响 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 副本。

...

客户希望有某种方法可以让两个 DLL A.DLLB.DLL 使用各自的 C.DLL 版本。 他们怀疑一些带有激活上下文和清单的魔法可能会起作用,但他们没有专业知识来弄清楚究竟是什么。

...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。