最近在看DirectShow,DirectShow又是基于COM的,因此这里来谈一谈COM,以笔记和心得的形式.后面会陆续更新包括DirectShow
因为是心得和笔记,叙述和理解可能有错误(红色标记的我是不确定的理解),欢迎大家指正。。。。。
需要了解的名词
在微软的COM中GUID和UUID、CLSID、IID都是同一个结构体的不同命令,所以各自代表的意义不同:
UUID :代表COM
CLSID :代表COM组件中的类,每个类是对应一个CLSID,一个DLL可以有多个CLSID,也就是说多个CLSID可以对应同一个DLL文件(不确定)
IID :代表COM组件中的接口,一个接口可以拥有多个函数
最通俗的解释:
COM是以接口的形式工作的,接口不过是抽象的类(或:结构)定义,
具体代码实现必须由COM组件来承载,
COM组件的物理位置通常在dll(动态连接库)中,
你要调用COM接口提供的功能,
就必须获得这个接口指针,
要获得接口指针,就必须先创建实现了这个接口的COM对象,
你要创建该对象,就必须调用 CoCreateInstance
以DLL文件举例
一个DLL文件对应一个CLSID,通过注册查找CLSID得到DLL文件的路径,这个功能是CoCreateInstance里面的部分代码完成
一个DLL文件有很多接口,实现不同功能
比如 接口1是打篮球,接口2是吃饭,每个接口对应一个IID_XXXXXX
实现接口1打篮球又有很多动作,比如传球,投篮等等.
实现接口2 吃饭也有很多动作,比如拿筷子等
接口1和接口2可以没有任何联系,一般接口和接口之间是有关系的,无关系的都封装在不同的DLL里了.(不确定)
我们怎么样得到这些接口指针呢.
首先就是调用CoCreateInstance,第一个参数就是DLL的CLSID,最后一个参数一般情况下是IUnknown指针 ,IUnknown是每个符合COM规范的DLL都必须提供的.
然后通过IUnknown的QueryInterface函数查询其他DLL中你真正想要的接口 这个函数的第一个参数就是IID_xxx,第二个参数就是这个接口的指针.
调用方式就是
HRESULT hr;
hr=CoCreateInstance(CLSID_XXXX,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(void**)&pUnknown);
pUnknown->QueryInterface(IID_IFilterGraph,(void**)&pGraph);
当然你也可以直接
hr=CoCreateInstance(CLSID_XXXX,NULL,CLSCTX_INPROC_SERVER,IID_IFilterGraph,(void**)&pGraph);
返回S_OK,表明接口存在....
两句应该是等效的,上面一句你可以更好的理解COM
具体的实现原理可以写成一本书,你可以参考
COM技术内幕-微软组件对象模型
COM原理实现与应用
待续。。。。。。。。。。。。。。。。。。。。。。。。。。