c++ - 延迟加载具有相同名称的不同库
问题描述
我有以下情况:
可执行应用程序可以通过 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?
解决方案
有没有办法影响 dll2.dll 的绑定,而不是使用 GetProcAddress 来获取检索到的 dll?
就在这里。您可以通过直接使用激活上下文 API手动或使用清单来为每个加载使用单独的激活上下文。
请参阅如何指定我的 DLL 应该从 DLL 所在的同一目录解析 DLL 依赖项?:
客户有一个加载两个 DLL 的程序,我们称它们
A.DLL
为B.DLL
. 这两个 DLL 都使用一个名为C.DLL
. 问题是这两个 DLL 想要使用不同的不兼容版本的C.DLL
. 这两个 DLL位于不同的文件夹中,每个文件夹都有一个对应A.DLL
的.B.DLL
C.DLL
...
客户希望有某种方法可以获取这两个 DLL
A.DLL
并B.DLL
使用它们各自版本的C.DLL
. 他们怀疑一些带有激活上下文和清单的魔法可能会奏效,但他们没有专业知识来弄清楚到底是什么。...
推荐阅读
- android - android MotionLayout中的RecyclerView滚动问题
- performance - 避免循环中的条件语句
- c++ - 为什么MingW编译错误?
- r - 合并到最近的索引日期
- python - tensorflow 1.10 中的`tf.group(tf.local_variables_initializer(), tf.global_variables_initializer())` 有替代方法吗?
- java - 当从 Java Repository 发送“关键字”时,如何让 PSQL 认为它是一个变量
- python - 如何减少数百万张图片的文件大小?
- javascript - 存储到MYSQL数据库时如何删除时区?
- java - 从对话框更新 TableLayout Tablerows
- javascript - innerHTML 返回 undefined - JavaScript