使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
What is the best way to insulate new C++ code from an older (binary) component using a different CRT?
我为用C++编写的Windows桌面应用程序开发了一个大型代码库。
多年前,我的公司向一家大得多的公司支付了使用一个组件的许可费,该组件被纳入我们的软件并提供关键服务。该组件是一个带有一些头文件的二进制blob,是使用VS2008运行时编译的。
因此,目前整个应用程序都依赖于VS2008运行时。我们无法升级到现代C++或我们使用的库的更新版本(例如,我们一直使用Qt4而不是Qt5(。由于各种原因,该公司几乎没有机会提供更新的Blob,虽然我们正计划编写自己的替代品,但这将需要大量时间。
同时,我希望能够以某种方式封装这个组件并隔离它,这样我们就可以将其余的代码升级到以后的运行时,并使用JSON或类似的方式与它通信有可能在未来的某个时候,我们可能会用我们自己的(或开源的(完全不是用C++编写的东西来替换组件。
我可以想出很多方法来做到这一点,但我不确定哪种是最好的,哪种能给我们最大的灵活性。读到COM,这似乎正是它创建的目的,但我不知道COM是否仍在积极开发和支持,以及它是否会将我们永远与Windows生态系统联系在一起。DCOM是非Windows版本,但如果说有什么不同的话,那就是它似乎更被抛弃了。
我对任何关于最佳方式的建议都很感兴趣。到目前为止,我的想法是:
- 非常小心地设计一个DLL(它可能起作用,也可能不起作用,我无法从如何在C++中构建运行时版本无关的DLL中判断出来?,但看起来它将是次优的(
- 使用COM(请参阅上面的保留意见(
- 作为一个单独的进程运行,并通过cin和cout管道传输数据(仅限于文本数据,可能会很慢?(
- 作为一个单独的进程运行,并运行一个简单的客户端/服务器关系(看起来很重要(
COM没有被积极开发,主要是因为它已经完成了。不过,它得到了积极支持。例如,当Windows采用64位时,COM也被移植到64位。它在必要时获得安全更新。
DCOM是COM的分布式变体。我不介意;你只需要设计一个单一用户帐户在一台电脑上运行的一切。这已经是你的应用程序的运行方式了。
VS2008非常乐意在(D(COM上使用BSTR
字符串,而VS2019有一个方便的_bstr_t
包装器。(我不记得VS2008是否已经有_bstr_t
了(。
你通常不需要使用COM的所有功能。COM被设计为许多不同应用程序之间的互操作平台,但代码库的两个部分由相同的开发人员编写,它们只需要相互协作。不需要动态发现COM接口等等。您只需将.h
文件与接口定义共享即可。
- 带内存和隔离功能的SQLite
- 如何将 txt 文件中的行分隔为组件C++
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 如何使用隔离>终止执行来停止所有线程
- 到连接组件算法的问题(递归)
- 从矢量中删除元素后出现隔离错误
- 两个 COM 组件中 ENUM 的重复条目
- 为什么 gcc 会产生这种奇怪的组件与叮当声?
- 使用 bfs 解决连接组件问题时得到错误的答案
- 如何在ECS框架中更新组件数据和通知系统
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 如何从ECS中的模板方法获取组件?
- 使用蓝牙组件将数据从Android手机传输到串行设备时出现问题
- 组件上的虚幻引擎可蓝图UFUNCTION会导致构建错误
- 在C++中访问蓝图类组件的正确方法是什么?
- 有关纯 ECS(实体组件系统)和更新系统的问题
- 提高基于组件的游戏引擎的效率
- 线程时访问静态映射时出现隔离错误
- 从组件的 std::type_index 获取派生最多的类型
- 我们可以将阈值应用于色彩空间模型的单个组件(如 RGB 和 LAB)吗?