使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么

What is the best way to insulate new C++ code from an older (binary) component using a different CRT?

本文关键字:隔离 组件 二进制 离开 是什么 方法 最佳 CRT 代码 C++      更新时间:2023-10-16

我为用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文件与接口定义共享即可。