替换Visual C ++中的#import

时间:2009-03-16 14:08:40

标签: visual-c++ com

我们有一个大型的C ++项目,我们用它来编译/ MP开关,以利用多个核心。

然而,我们最近引入了一些在几个tlb上使用#import的代码,而#import与/ MP不兼容,这意味着我们回到单线程构建并且有更多时间来喝咖啡。

有关如何让#import和/ MP玩得好的任何建议?是否有一个工具可以从#import静态生成C ++标头作为预构建步骤?

更新

以下马特的建议很有效。对于其他在google中绊倒的人来说:

  1. 创建一个单独的静态lib项目
  2. 设置足够的包含,以便您可以将#import语句放在lib项目中
  3. 使您的主项目依赖于lib项目(以确保正确的构建顺序)
  4. 将lib项目的临时构建文件夹添加到主项目的包含路径
  5. #include生成的.tlh文件,您正在执行#import
  6. 启用/MP开关并丢失咖啡休息时间......

7 个答案:

答案 0 :(得分:25)

为什么不只是#include#import创建生成的标头?

答案 1 :(得分:8)

(我对这个问题有点迟了,但这是我心中的一个问题。)

您可以尝试使用旧式的方式从C / C ++访问COM对象。这涉及COM对象的开发人员提供具有COM接口的C / C ++版本的客户端.h文件。这些文件看起来像#import的简单版本。

这些文件来自哪里?如果COM对象是用C / C ++(VC ++)编写的,那么这些对象来自MIDL编译器。此命令行工具获取ODL / IDL文件并从中创建C / C ++源代码。它发出的一些内容对客户端应用程序很有用。

如果您拥有COM对象的来源,则可能已有这些文件!

如果您只有TLB文件,则可以使用OLE / COM对象查看器(OLEVIEW.exe - 至少附带VC ++ 6.0),打开类型库和save-as和OLD / IDL文件。然后运行MIDL编译器以生成客户端C / C ++包含文件。有可能第三方COM对象可能带有这些文件,但它们通常不会(我记得Crystal Reports 做了一段时间,然后停止运送它们 - 把我们搞砸了 - 但是我离题)。

使用ATL智能指针(以及其他支持类)和MIDL创建的接口类几乎与#import创建的一样好。这取决于您使用的#import特定功能的数量。

对于/ MP我已经完成了我的建议以及接受的Matt Davison回答所建议的内容。

答案 2 :(得分:7)

您可以将/ MP选项作为整体使用,然后使用 / MP1 选项对单个文件进行例外处理。

答案 3 :(得分:3)

如果你可以限制你正在导入的文件数量,你可以将它们放在已经自动从/ ​​MP中排除的预编译头文件(例如stdafx.h)中。这避免了上述问题,因为所有其他文件将等到编译器直到stdafx.cpp完成,并且都会“继承”相同的#import'ed定义。

答案 4 :(得分:2)

一种选择是将导入移动到单独的DLL中,并使用不透明指针为它们提供包装类。然后只为该DLL禁用/ MP,其余的构建应该没问题。

答案 5 :(得分:1)

您可以将项目拆分为两部分,一部分或多或少地导入禁用/ MP,另一部分执行其他任何启用/ MP。

答案 6 :(得分:-2)