COM具有跨语言能力,理论上COM组件可被多种语言开发环境所使用,由于各种语言对COM接口的二进制结构的感知能力各不相同,所以COM组件在具体实现时使用了不同的办法对不同的语言提供支持,以达到声明接口结构的目的。 COM接口定义时可分为直接继承IUnkown接口(vtable结构)、直接声明为dispinterface和由IDispatch继承三种形式,一般来说分别称之为纯接口、分发接口和双接口 纯接口只有C/C++语言可以声明,理所当然是.h头文件的形式,也只有C/C++语言可以感知,但是通常并不使用C/C++直接书写.h头文件,而是使用midl命令对idl文件(接口定义文件)生成C/C++同时兼容的.h头文件。 VB和脚本语言只能识别分发接口的结构,这些语言的运行时库或虚拟机可以生成和识别.tlb文件,而.tlb文件也可以通过使用midl命令编译idl文件生成。 可以看出.h头文件和.tlb类型库文件实际上是起到相同的作用,即定义和感知接口的二进制结构,只不过一个是使用文本形式,一个是使用字节码形式。 需要说明的是C/C++语言是可以感知分发接口的结构的,因为它的编译器可以解析.tlb类型库文件,方法是:#import "xxx.tlb" no_namespace,这就是说VB和脚本语言实现的COM组件可以被C/C++语言环境使用,而C/C++语言定义的接口(.h头文件中定义)不能被VB和脚本语言感知,为了解决这个问题双接口应运而生,双接口的结构实际上就是纯接口+分发接口。在使用C/C++语言开发COM组件时,使用双接口定义就可以被VB和脚本语言使用了,当然双接口的接口函数的参数必须服从和分发接口情况下一样的限制,即必须是OLE变量兼容类型(Variant兼容类型)。 当时使用C/C++语言环境开发使用了双接口的COM组件时,为了供别人使用,通常需要提供.h头文件和.tlb类型库文件,使用VC++环境时,默认情况下.tlb类型库文件会作为一个资源编译到dll或exe文件中,所以dll或exe文件往往可以直接import使用,这样在组件发布时只需要一个二进制文件就可以了,便于使用(比如ADO组件)。 当二进制文件包含类型库时,直接import就可以了,如果不包含则需要.h头文件或.tlb类型库文件。