使用不同的 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 运行time.

编译的

目前,因此,整个应用程序现在依赖于VS2008 运行时间。我们无法升级到现代 C++ 或我们使用的库的更新版本(例如,我们停留在 Qt4 而不是 Qt5)。 由于各种原因,该公司几乎没有机会提供更新的 blob,而且虽然我们计划编写自己的替代品,但这将花费很多时间。

与此同时,我希望能够以某种方式包装这个组件并将其隔离,这样我们就可以将其余代码升级到以后的 运行 时间,并与之通信使用 JSON 或类似的。 可能在未来的某个时候,我们可能会用我们自己的(或开源的)完全不是用 C++ 编写的东西替换组件。

我可以想到多种方法来实现这一点,但我不确定哪种方法最好,哪种方法可以为我们提供最大的灵活性。阅读有关 COM 的文章,似乎这正是创建它的目的,但我不知道 COM 是否仍在积极开发和支持,以及它是否会永远将我们与 Windows 生态系统联系在一起。 DCOM 是非 Windows 版本,但如果有什么似乎更被遗弃的话。

我对有关最佳操作方式的任何建议感兴趣。到目前为止,我的想法是:

COM 没有积极开发,主要是因为它已经完成。不过,它得到了积极支持。例如,当 Windows 变为 64 位时,COM 也被移植到 64 位。它会在必要时获得安全更新。

DCOM 是 COM 的 分布式 变体。我不会打扰;您只需使用单个用户帐户在一台 PC 上将所有内容设计为 运行。无论如何,您的应用 运行 已经是这样了。

VS2008 非常乐意在 (D)COM 上使用 BSTR 字符串,而 VS2019 有一个方便的 _bstr_t 包装器。 (我不记得VS2008有没有_bstr_t)。

您通常不需要使用 COM 的所有功能。 COM 被设计为许多不同应用程序之间的互操作平台,但您拥有由相同开发人员编写的代码库的两个部分,它们只需要相互协作。无需动态发现 COM 接口等。您可以只共享一个包含接口定义的 .h 文件。