使用不同的 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 版本,但如果有什么似乎更被遗弃的话。
我对有关最佳操作方式的任何建议感兴趣。到目前为止,我的想法是:
- 非常仔细设计了一个DLL(可能有效也可能无效,我从How do I build a runtime version agnostic DLL in C++?看不出,但看起来会是次优的)
- 使用 COM(见上面的保留)
- 运行 作为一个单独的进程,并通过 cin 和 cout 传输数据(仅限于文本数据并且可能很慢?)
- 运行作为一个单独的进程,和运行一个简单的client/server关系(看起来重量级)
COM 没有积极开发,主要是因为它已经完成。不过,它得到了积极支持。例如,当 Windows 变为 64 位时,COM 也被移植到 64 位。它会在必要时获得安全更新。
DCOM 是 COM 的 分布式 变体。我不会打扰;您只需使用单个用户帐户在一台 PC 上将所有内容设计为 运行。无论如何,您的应用 运行 已经是这样了。
VS2008 非常乐意在 (D)COM 上使用 BSTR
字符串,而 VS2019 有一个方便的 _bstr_t
包装器。 (我不记得VS2008有没有_bstr_t
)。
您通常不需要使用 COM 的所有功能。 COM 被设计为许多不同应用程序之间的互操作平台,但您拥有由相同开发人员编写的代码库的两个部分,它们只需要相互协作。无需动态发现 COM 接口等。您可以只共享一个包含接口定义的 .h
文件。
我为用 C++ 编写的 Windows 桌面应用程序开发大型代码库。
很多年前,我的公司向一家大得多的公司支付了许可费,以使用我们软件中并入并提供关键服务的组件。该组件是一个带有一些头文件的二进制 blob,是使用 VS2008 运行time.
编译的目前,因此,整个应用程序现在依赖于VS2008 运行时间。我们无法升级到现代 C++ 或我们使用的库的更新版本(例如,我们停留在 Qt4 而不是 Qt5)。 由于各种原因,该公司几乎没有机会提供更新的 blob,而且虽然我们计划编写自己的替代品,但这将花费很多时间。
与此同时,我希望能够以某种方式包装这个组件并将其隔离,这样我们就可以将其余代码升级到以后的 运行 时间,并与之通信使用 JSON 或类似的。 可能在未来的某个时候,我们可能会用我们自己的(或开源的)完全不是用 C++ 编写的东西替换组件。
我可以想到多种方法来实现这一点,但我不确定哪种方法最好,哪种方法可以为我们提供最大的灵活性。阅读有关 COM 的文章,似乎这正是创建它的目的,但我不知道 COM 是否仍在积极开发和支持,以及它是否会永远将我们与 Windows 生态系统联系在一起。 DCOM 是非 Windows 版本,但如果有什么似乎更被遗弃的话。
我对有关最佳操作方式的任何建议感兴趣。到目前为止,我的想法是:
- 非常仔细设计了一个DLL(可能有效也可能无效,我从How do I build a runtime version agnostic DLL in C++?看不出,但看起来会是次优的)
- 使用 COM(见上面的保留)
- 运行 作为一个单独的进程,并通过 cin 和 cout 传输数据(仅限于文本数据并且可能很慢?)
- 运行作为一个单独的进程,和运行一个简单的client/server关系(看起来重量级)
COM 没有积极开发,主要是因为它已经完成。不过,它得到了积极支持。例如,当 Windows 变为 64 位时,COM 也被移植到 64 位。它会在必要时获得安全更新。
DCOM 是 COM 的 分布式 变体。我不会打扰;您只需使用单个用户帐户在一台 PC 上将所有内容设计为 运行。无论如何,您的应用 运行 已经是这样了。
VS2008 非常乐意在 (D)COM 上使用 BSTR
字符串,而 VS2019 有一个方便的 _bstr_t
包装器。 (我不记得VS2008有没有_bstr_t
)。
您通常不需要使用 COM 的所有功能。 COM 被设计为许多不同应用程序之间的互操作平台,但您拥有由相同开发人员编写的代码库的两个部分,它们只需要相互协作。无需动态发现 COM 接口等。您可以只共享一个包含接口定义的 .h
文件。