COM组件宏观认识

一直搞不清楚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);

rclsid
[in] 用来唯一标识一个对象的CLSID(128位),需要用它来创建指定对象。即组件的CLSID值,也就是组件类的CLSID.
pUnkOuter
[in] 如果为NULL, 表明此对象不是聚合式对象一部分。如果不是NULL, 则指针指向一个聚合式对象的IUnknown接口。一般为NULL
dwClsContext
[in] 组件类别. 可使用CLSCTX枚举器中预定义的值.
可选取值如下:
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
riid
[in] 引用接口标识符,用来与对象通信。即所需接口的IID值
ppv
[out] 用来接收指向接口地址的指针变量。如果函数调用成功,*ppv包括请求的接口指针。即返回的所需要的接口的指针
返回值
S_OK

本文转载自且有示例: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

原文地址:https://www.cnblogs.com/zhuluqing/p/8540576.html