【问题标题】:#import command line equivalent#import 命令行等效项
【发布时间】:2010-12-21 18:21:40
【问题描述】:

将 Visual Studio 与 Microsoft 的 C++ 编译器结合使用,我们有几个源文件,它们使用 Microsoft 特定的“#import”指令来导入类型库。例如:

#import my_type_lib.tlb

我想从源代码中删除#import,并将其替换为要通过 GNU Make 执行的命令行步骤。必要的接口定义(.idl 源代码)在构建期间可用。

如何删除我对#import 的依赖,并将其替换为通过命令行执行的专用构建工具?

【问题讨论】:

    标签: c++ visual-studio com import visual-c++


    【解决方案1】:

    据我所知,没有单独的工具可以从类型库生成代码。

    您可以执行一次#import,然后隐藏生成的文件并将它们作为常规源文件包含在内。但随后对类型库的更改将需要一个新的受监督构建来重新生成文件。

    您使用了生成信息的哪些部分?如果您只使用它来获取 IID、接口和 CLSID,并且您拥有 .IDL,则可以使用 MIDL.EXE 生成 C++ 表示。

    如果您使用包装类 (IxxxPtr),我认为您运气不佳——这些是由 #import 生成的。

    【讨论】:

    • 无赖。我注意到使用 MIDL 编译 .IDL 会生成一个头文件和一些源文件 (.C)。编译源文件并将它们链接到项目中是否等同于#import'ing TLB?
    • 仅从 typelib 获取接口定义、IID 和 CLSID。你不会得到包装器。
    【解决方案2】:

    我突然想到,您可以直接使用编译器从类型库中生成 .tli/.tlh 文件。

    用一个简单的源文件,像这样

    // imports.cpp
    #import "foo.dll"
    #import "bar.dll"
    
    int main(int argc, char* argv[])
    {
    }
    

    您可以使用 cl.exe 生成#import 包装器,以及一个无用的 .exe 文件,如下所示:

    ...\>cl.exe imports.cpp
    

    从那时起,#include 常规源代码中的包装器 (foo.tlh/.tli)。

    不确定这是对#import 的改进,但至少您已经从代码库中提取了#import

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-20
      • 2013-02-02
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2016-07-28
      • 2021-06-07
      相关资源
      最近更新 更多