首页 > 解决方案 > 延迟加载具有相同名称的不同库

问题描述

我有以下情况:

可执行应用程序可以通过 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++dlllibdelay-load

解决方案


有没有办法影响 dll2.dll 的绑定,而不是使用 GetProcAddress 来获取检索到的 dll?

就在这里。您可以通过直接使用激活上下文 API手动或使用清单来为每个加载使用单独的激活上下文。

请参阅如何指定我的 DLL 应该从 DLL 所在的同一目录解析 DLL 依赖项?

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

...

客户希望有某种方法可以获取这两个 DLLA.DLLB.DLL使用它们各自版本的C.DLL. 他们怀疑一些带有激活上下文和清单的魔法可能会奏效,但他们没有专业知识来弄清楚到底是什么。

...


推荐阅读