【问题标题】:Replacement for #import in Visual C++在 Visual C++ 中替换 #import
【发布时间】:2010-10-13 15:05:56
【问题描述】:

我们有一个大型 C++ 项目,我们使用 /MP 开关进行编译以利用多个内核。

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

关于如何让#import 和 /MP 发挥出色的任何建议?是否有工具可以从 #import 作为预构建步骤静态生成 C++ 标头?

更新:

听从马特的建议效果很好。对于在谷歌中遇到这个问题的其他人:

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

【问题讨论】:

    标签: visual-c++ com


    【解决方案1】:

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

    【讨论】:

    • 完美...我没有注意输出目录中的'tlh'文件,但这看起来正是我需要的
    • 优秀。我从来不知道这个!
    【解决方案2】:

    (我对这个问题有点晚了,但这是我心中的一个近在咫尺的问题。)

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

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

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

    如果您只有 TLB 文件,您可以使用 OLE/COM 对象查看器(OLEVIEW.exe - 至少带有 VC++ 6.0)打开类型库并另存为和 OLD/IDL 文件。然后运行 ​​MIDL 编译器生成客户端 C/C++ 包含文件。第三方 COM 对象可能会附带这些文件,但它们通常没有(我记得 Crystal Reports 确实 有一段时间,然后停止发送它们 - 让我们大吃一惊 - 但我离题)。

    将 ATL 智能指针(和其他支持类)与 MIDL 创建的接口类一起使用几乎与 #import 创建的一样好。这取决于您使用了多少#import-specific 功能。

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

    【讨论】:

    • 我确实有 COM 对象的源代码,但是生成的头文件错过了命名空间,并且仅将 #includes 包装在命名空间中是行不通的。有什么方法可以让包含与#import 的功能兼容?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 这可行,但将导入分离到一个单独的 DLL 并包装它们会很费力。
        • 是的,但在此过程中,您将加快构建速度并将您正在使用的库与您的使用分离。
        【解决方案6】:

        您可以将项目分成两部分,一部分或多或少地执行禁用 /MP 的导入,另一部分执行其他所有操作以启用 /MP。

        【讨论】:

          猜你喜欢
          • 2021-08-10
          • 1970-01-01
          • 2013-07-17
          • 1970-01-01
          • 1970-01-01
          • 2011-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多