com组件

到底COM是个啥?

强颜欢笑 提交于 2019-11-27 00:51:55
COM(Component Object Model) 定义了一个在运行时可复用组件直接进行二进制的交互时的标准。说白了,就是进程、组件之间数据交换的标准。只要按照这个标准来实现,进程、组件就可以跨越机器的界限交换数据,包括函数调用,参数传递等等。既然是二进制标准,那就应该是跟语言无关的,不管你用C++,C还是Java或者Python都可以在Linux或者其他系统上实现一套COM,然后跟现在微软的COM进行通信,事实上COM对语言有一点要求,就是必须支持function pointer,那C是可以的,Java就不行了。 为什么COM必须要求语言支持function pointer呢?因为指针可以隐藏实现的细节,比如,你现在有一个interface pointer,你是不知道到底它指向什么的,只有执行起来,才知道调用哪个实现。那为什么不用引用或者Java中类似的方法呢?引用不能调用方法啊! 首先看COM是由哪些部分组成的: host system提供run-time environment能够满足COM标准的要求; Interfaces 定义了feature contracts,component实现了这些interface,也就是实现了feature; Server 负责把component提供给host system,client则使用component提供的feature;

关于com组件中idl文件的理解

微笑、不失礼 提交于 2019-11-26 06:10:44
IDL文件: IDL文件主要定义两大类内容:一是定义接口;二是定义类型库。 定义接口的关键字是interface。每个接口定义前面方括号里面的内容是该接口的属性,最重要的是uuid的定义。该部分经过MIDL.exe编译后生成projectName_i.c和projectName_i.h文件,包含着接口本身(属性(uuid,helpstring等)和方法)的信息。该部分作用是定义接口。 定义类型库的关键字是library。一般一个com组件只有一个类型库。该部分包含了COM类的声明及它的接口声明。该部分被编译后生成类型库文件(.tlb)。该部分作用是用于为客户端提供识别COM组件的接口、函数名、参数等信息。 IDL文件中的[]表示对一个接口,接口方法,接口属性,类型库,类的附加说明,也相当于属性设置。 凡是接口,类型库和com类都需要定义它们的guid值。 来源: CSDN 作者: jiangqin115 链接: https://blog.csdn.net/jiangqin115/article/details/103241048

COM组件的集合与包容

大城市里の小女人 提交于 2019-11-26 06:09:36
集合与包容,实质就是组件之间的互相调用。即一个组件使用另一个组件的功能,达到代码复用的作用。只是这种复用是构建在二进制数据上的(因为被复用的组件常常以dll的格式存在),而不是像c++代码复用是以源文件的形式复用。 集合与包容的区别在于: 包容是将内组件的功能进行封装,由外组件提供接口供客户调用,但实质执行任务的仍然是内组件。 集合是将内组件的功能暴露出来供客户调用,让客户感觉好像调用的是外组件的接口一样。 集合实现的方法是先实例化内组件类,返回内组件的IUnknown接口指针pUnk。在外组件的QuryInterface(riid,ppv)中通过if语句根据传入的riid值,调用pUnk->QuryInterface(riid,ppv)返回内组件的指定接口。 来源: CSDN 作者: jiangqin115 链接: https://blog.csdn.net/jiangqin115/article/details/103241113

MFC实现COM组件

╄→尐↘猪︶ㄣ 提交于 2019-11-26 05:58:32
一般而言,ATL实现了对COM组件最好的支持,所以不用MFC实现COM组件。但是MFC实际上也是可以实现COM组件的。 一、MFC DLL优点: MFC com组件可以将MFC的类型作为参数进行传递,但ATL com只能用规定的COM数据类型。但实际上MFC 扩展dll也可以用MFC类型作为参数。 具体代码: https://github.com/moisiet/MFC-COM COM组件与普通的DLL区别在于:1.COM组件需要注册才能使用,而普通的DLL不需要注册,直接LoadLibrary使用;2.COM组件通过暴露接口指针被调用,而普通DLL是暴露函数地址被调用。 MFC实现COM组件必须要选择Automation这个选项。 选择了这个选项才会提供注册,反注册和类工厂函数。 MFC实现COM组件时,实现接口的类必须是继承自CCmdTarget(或者其子类)的类,且必须选择Automation或者Created by ID 这个选项,因为只有该类才提供对IUnknown的支持。 MFC是通过嵌入类真正实现接口的(嵌入类包含再定义的继承自CCmdTarget类中)。 因此MFC实现COM方式与ATL实现COM方式是不一样的,一定要搞清楚。 当给定IID使用QuryInterface查找某个接口的时候,返回的实际并不是接口的指针,返回的是实现接口的内置类实例对象的地址