一直搞不清楚COM到底是个什么东西,记录一些个人感想,可能很多错误的,慢慢消化.
一.宏观认识:
1.COM(组件对象模型)是一种标准,规则,要求,即即于建筑设计指标要求.
2.语言无关性,因为是建立在二进制基础上的,也就是说客户调用COM组件时只能看到二进制而看不到未经编译的源代码程序,因此就不用管用什么语言编写的COM组件了.只要该语言编写的东西符合COM的标准就可以了.就相当于不用管房子是什么材料建成的,只要满足坚固安全保温通透漂亮舒适就可以了一样.
3.接口是一组相关函数的集合,记住是集合,是一种独特的数据结构.用关键字interace修饰,大写I开头的标识符表示.COM组建被调用时,COM客户只能看到接口,而接口的实现类对客户是隐藏的.客户要使用COM的功能,就必须找到接口的指针,通过接口指针调用接口函数来实现功能.每个接口都对应着一个128位的GUID(全局统一标识符).当COM组建在计算机中注册后,这个GUID作为公共变量保存在计算机的注册表中,这样,通过GUID计算机就能够找个这个接口了(通过调用CoCreateInstance()函数).
4.COM组件,作为COM接口,COM类及其关系的统称,以dll或exe形式存在.每个COM组件都对应一个GUID号,它的作用是作为该组建的唯一引用,存放在计算机的注册表中,供其他使用该COM组建的程序查找到该组建.因此,COM组件注册的过程就是将组建GUID注册到注册表的过程.
5.COM组件,COM接口和COM类都有唯一的GUID值.
6.COM类实现了COM接口,而每个COM接口都必须继承自IUnknown接口,这就是说,每个接口都可以通过quryinterface()函数查找到其他的接口指针.因为所有的IUnknown都是同一个.
二.组件的使用:
window系统API有个函数叫CoCreateInstance()函数,用于创建组建,返回所需接口指针.
HRESULT _stdcall CoCreateInstance(REFCLSID rclsid,
LPUNKNOWN pUnkOuter,
DWORD dwClsContext,
REFIID riid,
LPVOID * ppv);
CLSCTX_INPROC_SERVER
|
创建在同一进程中运行的组件。为能够同一进程中运行,
组件必须是在DLL中实现的。
|
CLSCTX_INPROC_HANDLER
|
创建进程中处理器。一个进程中处理器实际上是一个
只实现了某个组建一部分的进程中组件。该组件的其他部分将
由本地或远程服务器上的某个进程外组件实现。
|
CLSCTX_LOCAL_SERVER
|
创建一个在同一机器上的另外一个进程中运行的组件。
本地服务器是由exe实现的。
|
CLSCTX_REMOTE_SERVER
|
创建一个在远程机器上运行的组件。此标志需要分布式
COM正常工作。
|
CLSCTX_INPROC
|
CLSCTX_LOCAL_SERVER
CLSCTX_INPROC_HANDLER
|
CLSCTX_ALL
|
CLSCTX_INPROC_SERVER
CLSCTX_INPROC_HANDLER
CLSCTX_LOCAL_SERVER
CLSCTX_REMOTE_SERVER
|
CLSCTX_SERVER
|
CLSCTX_INPROC_SERVER
CLSCTX_LOCAL_SERVER
CLSCTX_REMOTE_SERVER
|
本文转载自且有示例:https://www.cnblogs.com/fangyukuan/archive/2010/06/11/1756724.html
用ATL创建COM组件的过程:http://www.cnblogs.com/fangyukuan/archive/2010/04/09/1708651.html
COM组件注册步骤及注册的原因:http://blog.csdn.net/jasonliao909/article/details/50505717