COM - #include生成的头文件vs #import生成的tlb

pau*_*ulm 4 com idl visual-studio-2010 visual-c++

我有很多生成COM DLL的项目,这些项目输出如下:

projectname_i.h
projectname_i.c
projectname_p.c
projectname_i.tlb
Run Code Online (Sandbox Code Playgroud)

然后在另一个项目使用此DLL的地方使用它,如下所示:

#import "projectname.tlb" named_guids no_namespace
Run Code Online (Sandbox Code Playgroud)

我想将此更改为使用include而不是import.

想从改变背后的原因#import#include是因为我想使/MP编译器开关,加快构建时间.

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

所以我想知道的是:

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

Han*_*ant 9

为什么COM DLL有TLB和H?

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

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

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

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

  • 我发现最好的方法似乎是设置一个带有#imports的cpp,这个文件已关闭/ MP.然后我可以包括tlh's,它似乎工作得很好:). (4认同)