我有许多生成COM DLL的项目,这些项目输出如下:
projectname_i.h
projectname_i.c
projectname_p.c
projectname_i.tlb
然后在另一个项目使用此DLL的地方使用它,如下所示:
#import "projectname.tlb" named_guids no_namespace
我想将其更改为使用include而不是import。
背后想要从#import
更改为#include
的原因是因为我想启用/MP
编译器开关来加快构建时间。
http://msdn.microsoft.com/en-us/library/bb385193.aspx
所以我想知道的是:
答案 0 :(得分:8)
为什么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指令 more ,它会自动生成.tlh
和.tli
文件,该文件在客户端代码中获得#included。这些文件为COM服务器中的接口声明了智能指针类型,使得批次的类型更容易使用服务器。在文本编辑器中打开这些文件以查看它们包含的内容。如果您的客户端代码使用XxxxPtr类型或捕获从错误返回代码自动生成的_com_error异常,那么如果您不想使用,那么您正在查看非常大量重写客户端代码#import指令。
如果COM服务器稳定且其接口声明不再发生变化,那么您可以签入.tlh和.tli文件,并将#import替换为这些文件的两个#include。请务必在代码中留下注释,以显示维护者如何重新生成文件,“永不改变”是一个难以实现的目标。当然,如果你试图使/ MP生效,这个技巧是不合适的,这表明COM服务器仍在改变。