隔离新C++;使用不同CRT的旧(二进制)组件的代码? 我在C++编写的Windows桌面应用程序上使用了一个大的代码库。

隔离新C++;使用不同CRT的旧(二进制)组件的代码? 我在C++编写的Windows桌面应用程序上使用了一个大的代码库。,c++,com,msvcrt,C++,Com,Msvcrt,许多年前,我的公司向一家大得多的公司支付了许可费,以使用一个整合到我们软件中并提供关键服务的组件。该组件是一个带有一些头文件的二进制blob,是使用VS2008运行时编译的 目前,整个应用程序都依赖于VS2008运行时。我们无法升级到现代的C++,或者我们使用的新版本的库(我们停留在QT4上,而不是QT5)。 由于各种原因,上述公司提供更新blob的可能性很小,甚至没有。虽然我们正计划编写自己的替换版本,但这将花费大量时间 同时,我希望能够以某种方式包装这个组件并将其隔离,这样我们就可以将其余的

许多年前,我的公司向一家大得多的公司支付了许可费,以使用一个整合到我们软件中并提供关键服务的组件。该组件是一个带有一些头文件的二进制blob,是使用VS2008运行时编译的

目前,整个应用程序都依赖于VS2008运行时。我们无法升级到现代的C++,或者我们使用的新版本的库(我们停留在QT4上,而不是QT5)。 由于各种原因,上述公司提供更新blob的可能性很小,甚至没有。虽然我们正计划编写自己的替换版本,但这将花费大量时间

同时,我希望能够以某种方式包装这个组件并将其隔离,这样我们就可以将其余的代码升级到以后的运行时,并使用JSON或类似工具与之通信。在将来的某个时间点,我们可以用我们自己的(或者开源的)来代替组件,而不是用C++编写的。 我可以想出很多方法来做到这一点,但我不确定哪种方法是最好的,哪种方法会给我们带来最大的灵活性。阅读有关COM的文章,似乎这正是它创建的目的,但我不知道COM是否仍在积极开发和支持,它是否会将我们永远与Windows生态系统联系在一起。DCOM是非Windows版本,但如果有任何东西看起来更废弃的话

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

  • 非常仔细地设计一个DLL(它可能工作,也可能不工作,我不能从中分辨出来,但它看起来是次优的)
  • 使用COM(请参见上面的预订)
  • 作为单独的进程运行,并通过cin和cout传输数据(仅限于文本数据,可能速度较慢?)
  • 作为单独的进程运行,并运行简单的客户机/服务器关系(似乎很重要)

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

      DCOM是COM的分布式变体。我不想麻烦;您只需使用单个用户帐户将所有内容设计为在一台PC上运行。这已经是你的应用程序运行的方式了

      VS2008非常乐意在(D)COM上使用
      BSTR
      字符串,VS2019为此提供了一个方便的
      \BSTR\t
      包装器。(我不记得VS2008是否已经有了
      \u bstr\u t


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

      如果您当前绑定到VS2008,绑定到Windows会有什么问题?绑定到VS2008已经意味着绑定到Windows。您已经有了一些选项,如果所述库是使用CRT动态构建的,那么很难说哪一个最适合您,唯一的选项就是进程间通信。这种通信的本质将由LIB提供的实际功能来定义。这不是一个大问题,但除了问题组件之外,其他所有东西都是C++和QT,所以几乎不依赖于OS。我的本能是尽可能避免平台依赖。在另一个进程中托管dll看起来很干净。但你会失去表现。您需要的COM部件远未被废弃。COM在Windows中无处不在,在新的WinRT中也是如此。它甚至允许您执行x64-x86 ipc。我会选择COM。>COM没有被积极开发,主要是因为它已经完成了。它得到了积极的支持,尽管我没有这样看待它。这非常清楚,COM似乎是最适合我想做的事情的技术。这似乎是正确的做法:特别是因为你指出我们不需要使用一些更重的东西。谢谢你的回答。现在找到一个合适的、最新的“COM入门”资源:)