【问题标题】:COM - #include generated header vs #import generated tlbCOM - #include 生成的标头与 #import 生成的 tlb
【发布时间】:2012-11-21 22:09:24
【问题描述】:

我有许多生成 COM DLL 的项目,这些项目输出以下内容:

projectname_i.h
projectname_i.c
projectname_p.c
projectname_i.tlb

然后在另一个项目使用此 DLL 时,它的使用方式如下:

#import "projectname.tlb" named_guids no_namespace

我想将其更改为使用包含而不是导入。

想要从 #import 更改为 #include 背后的原因是因为我想启用 /MP 编译器开关以加快构建时间。

http://msdn.microsoft.com/en-us/library/bb385193.aspx

所以我想知道的是:

  • 为什么 COM DLL 有一个 TLB 和一个 H?
  • 应该使用哪个以及为什么?
  • 使用#include 和#import 有什么区别?切换到#include 会产生任何不可预见的后果吗?

【问题讨论】:

    标签: visual-studio-2010 visual-c++ com idl


    【解决方案1】:

    为什么 COM DLL 有一个 TLB 和一个 H?

    生成的_i.h 文件包含您在IDL 文件中以C 或c++ 编译器可用的格式编写的声明。 .tlb 文件是一个类型库,它包含格式为任何支持 COM 的语言都可以使用的 IDL 声明。它作为资源嵌入到 COM 服务器 DLL 中。任何使用您的 COM 服务器的人都将需要它。如果您不构建代理/存根 DLL,那么在运行时可能还需要它来编组跨单元的调用。

    使用#include 和#import 有什么区别?

    只要客户端是用 C 或 C++ 编写的,#include _i.h 文件就足以获得使用服务器所需的声明。但是请注意,#import 指令确实more,它会自动生成一个.tlh 和一个.tli 文件,这些文件会在客户端代码中#included。这些文件为 COM 服务器中的接口声明了智能指针类型,这些类型使得它很多更容易使用服务器。在文本编辑器中打开这些文件以查看它们包含的内容。如果您的客户端代码使用 XxxxPtr 类型或捕获从错误返回代码自动生成的 _com_error 异常,那么如果您不想使用,您正在查看客户端代码的非常实质性重写#import 指令。

    如果 COM 服务器稳定且其接口声明不再更改,则您可以签入 .tlh 和 .tli 文件,并将这些文件的 #import 替换为两个 #include。请务必在代码中留下注释,向维护者展示如何重新生成文件,“永不更改”是一个难以实现的目标。当然,如果您尝试使 /MP 生效,则此技巧不合适,这表明 COM 服务器仍在更改。

    【讨论】:

    • 我发现最好的方法似乎是设置一个带有#imports的cpp,这个文件已经关闭了/MP。然后我可以包含 tlh,它似乎工作得很好:)。
    猜你喜欢
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多