延迟加载具有相同名称的不同库
Posted
技术标签:
【中文标题】延迟加载具有相同名称的不同库【英文标题】:DelayLoad different libraries with identical names 【发布时间】:2021-06-16 20:55:09 【问题描述】:我有以下场景:
可执行应用程序可以通过 dll 进行自定义,并且可以并行启动多个自定义项。对于常见任务,这些 dll 可以使用动态链接的开源库,例如 OpenSSL(libssl.lib、libcrypto.lib,它们正在检索模块 libssl-1_1-x64。 dll 和 libcrypto-1_1-x64.dll)。
为了检索所需的库模块,它们与 /delayload 选项链接。但是,如果库具有相同的名称(例如,因为它们是同一库的不同版本),则第一个 LoadLibrary
将为所有库进行绑定。
在更抽象的描述中,以下场景将检索 lib1\lib.dll 和 lib2\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?
【问题讨论】:
【参考方案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.DLL
和B.DLL
。 这两个 DLL 都使用一个名为C.DLL
的通用帮助 DLL。问题是这两个 DLL 想要使用C.DLL
的不同的不兼容版本。 两个 DLLA.DLL
和B.DLL
位于不同的文件夹中,每个文件夹都有对应的C.DLL
的副本。...
客户希望有办法让
A.DLL
和B.DLL
两个DLL 使用它们各自版本的C.DLL
。 他们怀疑一些带有激活上下文和清单的魔法可能会解决问题,但他们没有专业知识来弄清楚到底是什么。...
【讨论】:
以上是关于延迟加载具有相同名称的不同库的主要内容,如果未能解决你的问题,请参考以下文章