COM - #include 生成的标头与 #import 生成的 tlb

2023-12-21

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

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

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

#import "projectname.tlb" named_guids no_namespace

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

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

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

所以我想知道的是:

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

为什么 COM DLL 有 TLB 和 H?

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

COM - #include 生成的标头与 #import 生成的 tlb 的相关文章

随机推荐