读书笔记-COM原理与应用

>>> COM规范和COM库
>>> COM模型中对象本身对于用户来说是不可见的,只与接口打交道,对象对客户来说只是一组接口
>>> 每个接口有一个128位的GUID来标识,每个COM对象也用一个128位的GUID来标识(CLSID),
客户程序用CLSID来创建COM对象,接口标识符IID。
>>> 根据COM规范,一个COM对象如果实现了多个接口,则可以从某个接口得到该对象的任意其他接口

>>> COM库
1)提供少量的API函数实现客户和服务器端COM应用的创建过程
2)通过注册表查找本地服务器即EXE程序,以及程序名与CLSID的转换等.
3)提供了一种标准的内存控制方法
>>> ADO是建立在OLE DB上层的自动化对象库,OLD DB完全基于COM,是ODBC的替代品,不在局限于关系型数据库
>>> ActiveX技术包含了所有基于COM的Internet 相关技术。ASP对象也是COM对象
>>> C++类和对象的重用行应用最广泛的是类库
>>> _cdecl可以实现C语言用到的函数可变参数的特性(printf),这种方式下,有调用程序处理栈的恢复。
除非要使用可变参数特性,否则就使用_stdllcall调用习惯
>>> COM接口的二进制结构,接口指针指向另一个指针,这第二个指针指向一组函数,接口函数表(vtable)
>>> 接口成员函数中,字符串变量必须用UNICODE字符指针
>>> COM规范的核心内容是关于接口的定义
>>> COM接口描述语言IDL,一种不依赖于任何语言的接口描述方法,成为组建程序和客户程序的共同语言
MIDL工具可以把接口描述文件编译成C/C++兼容的接口描述文件(.h)

2    COM接口和对象
    2.1    COM对象
    2.2    COM接口
        2.2.5     接口的内存模型
                   每个接口成员函数都包含一个this指针,可以访问到该对象的属性数据
        2.2.6     接口的一些特点
                       1)二进制特性
                       2)接口不变性
                       3)继承性(扩展性),
                            接口继承,单继承只能
                       4)多态性
                           统一的方法处理不同的对象,只要他们实现了相同的接口

    2.3    IUnknow接口
        作用:生存期控制和接口查询
        对象一级引用计数
        2.3.1    引用计数
        2.3.3    使用引用计数规则(p39)
        2.3.4    接口查询
        2.3.5    COM对象的接口原则
            1)对于同一个对象的不同接口指针,查询得到的IUnknow接口必须完全相同,其他接口,通过不同途径得到的接口指针可以不一样
            2)接口对称性。对一个接口查询其自身总应该成功
            3)接口对称性。从A可以查到B,则可以从B查到A
            4)接口传递性。A可以查到B,B可以查到C,则C可以查到A
            5)接口查询时间无关性
        2.3.6    QueryInterface成员函数的实现
            C++中实现多接口COM的方法:1)多重继承,2)内嵌接口类成员
        2.3.7    COM对象和接口图示法

3    COM的实现
    组件程序和客户程序之间通信的规范
    COM的实现与操作系统平台密切相关
    3.1    进程内组件和进程外组件
        3.1.2    进程外组件
            进程间通信:DDE,named pipe,or 共享内存。COM采用LPC和RPC的方法进行进程间的通信
            LPC用于同一机器上的不同进程之间
            操作系统何以调用任何一个进程中的函数
            客户程序<--->代理DLL--LPC-----存根DLL<--->组件程序
            客户程序调用的参数组装成一个数据包传递给组件进程的过程称为marshaling,组件进程收到数据包解包提取参数的过程成为unmarshling
            除了实现组件程序外,还应该实现代理DLL和存根DLL两个模块
    3.2    通过注册表管理COM对象
        客户程序通过COM库完成对象的创建工作
        组件的注册:组件程序把它所实现的COM对象的信息以及接口信息保存到注册表的过程
        3.2.2    COM组件注册信息
            CLSID子键下,列出了当前机器上所有的组件的信息。
            如果是进程内组件,则组件的CLSID下包含InprocServer32子键,缺省值,组件程序的全路径名。
            进程外组件,包含LocalServer32子键,
           
            Interface子键给出了当前系统中一些COM接口的配置信息,
            TypeLib子键给出了当前系统中类型库的信息

            在Windows系统中,除了CLSID可以唯一标识一个COM对象外,同时也可以用字符串
            对组件对象命名,这样的名字信息称为ProgID,被直接放在注册表的HKEY_CLASSES_ROOT下
            COM API函数CLSIDFromProgID和ProgIDFromCLSID用来CLSID和ProgID的转换

            如果COM组件支持同样一组接口,则可以把他们分类到同一类中,一个组件对象可以
            被分到多个类中,所有自动化对象都支持IDispatch接口。
            类别信息也用一个GUID类描述,称为CATID
            在HKEY_CLASSES_ROOT键下有一子键Component Categories,包含了当前机器上所有的
            组件类别,列出了每个组件类别的CATID
        3.2.3    COM组件的注册操作
            自注册组件程序/非自注册组件程序
            一个注册进程内组件的实用工具RegSvr32.exe,组件程序用于注册的两个入口函数
            DllRegisterServer(), DllUnregisterServer()

            COM规范中规定,支持自注册的进程外组件必须支持两个命令行参数/RegServer和/UnRegServer
    3.3    类厂(class factory)
        COM库的创建函数根据注册表的信息并调用组件程序的入口函数来进行组件对象的创建工作
        组件程序需提供一个标准的入口函数DllGetObjectClass
        3.3.1    类厂和DllGetObjectClass函数
            类厂应该是“对象厂”,用来创建COM对象。对应每一个COM类,有一个
            专门的类厂用于COM类的对象的创建操作。类厂本身也是一个COM对象,它
            只支持一个特殊的接口IClassFactory
            COM规定,每一个COM对象类应该有一个相应的类厂对象,如果一个组件程序实现了多个COM对象类,/
            则相应有多个类厂
            DllGetClassObject引出函数用来创建类厂对象
        3.3.2    COM库与类厂的交互
            CoGetClassObject(), CoCreateInstance(), CoCreateInstanceEx()
            IClassFactory2接口是对IClassFactory的扩展,它加强了组件创建的安全性
        3.3.3    类厂的实现
        3.3.4    类厂对组件生存期的控制
    3.4    COM库
        COM库实现了COM规范,充当组件程序和客户程序之间的桥梁,在组件对象的创建,对象的管理,内存的管理和一些
        标准化操作等方面起着重要作用
        3.4.1    COM库的初始化
            CoInitialize() / CoUninitialize()
        3.4.2    COM库的内存管理
            CoGetMelloc()
            CoTaskMemAlloc(), CoTaskMemFree(), CoTaskMemRealloc()
            COM库的两种内存管理器:1)作业分配器(缺省), 本进程内有效。
                        2)共享分配器,OLE系统提供,跨进程
        3.4.3    组件程序的装载和卸载
            进程内组件的卸载:组件中对象数为0,类厂的锁计数器为0,客户程序调用,CoFreeUnusedLibraries()
        3.4.4    常用函数和HRESULT
    3.5    COM实现过程

4    COM特性
    4.1    可重用性:包容和聚合
        并不是所有得对象都能够支持聚合特性,但聚合体现了组件软件真正意义上得得重用,包容得重用性完全建立在C/S模型相对性得基础上

        包容模型得一种典型用法。由于接口定义得不变性,但接口扩展时,通过接口继承来实现接口得扩展,在实现新得接口时通过包容来重用以前得组件
        (skipped 聚合)
    4.2    进程透明性(skipped,进程外组件得透明性得实现)
    4.3    安全性(skipped)
    4.4    多线程特性
        apartment thread主函数中有消息循环, free thread主函数中不包括消息循环
        4.4.2    列集和同步(skipped)
        skipped next   

5
    5.2
        5.2.1    用嵌套类实现COM接口
            MFC采用了C++嵌套类得原理实现COM接口
        5.2.2    接口映射表
            CcmdTarget本身只提供了COM接口支持的结构,并没有实现特定的接口
        。。。。。
    5.3    用Visual C++ 开发COM应用
        各种建立在COM基础上的应用技术:自动化对象,ActiveX控间,OLE服务程序,OLE包容器程序,MTS对象,ASP对象.....
        ATL使用多重继承的方式实现COM接口,MFC采用接口映射表,ATL,采用了COM映射表
        CComObjectRootEx模板类实现了IUnknow成员方法,CComCoClass模板类为对象定义了缺省的类厂
        对象映射表

        5.4.2
        ColeControl继承于CWnd和CCmdTarget,利用ColeControl类,可以实现ActiveX 控间的所有特性
        5.4.3    复合文档是OLE的核心技术,也是ActiveX技术的重要部分,但复合文档技术非常复杂,它本身形成了
            一套完整的规范。MFC提供了一组类,这些类实现了复合文档服务程序和包容器程序交互过程中的所有特性

6    可连接对象
    如果一个COM对象支持一个或多个出接口(outgoing interface),则我们称这样的对象为可连接对象(connectable object),也称源对象(source)
    可连接对象的出接口也是COM接口。出接口并不由对象实现,而是由客户程序来实现,客户实现这些接口,并把接口指针告诉对象,
    以后对象利用此接口指针与客户进行通信。在客户程序方,实现这些接口的对象称为接收器(sink),接收器本省也是一个COM对象

    COM只要求接收器是一个独立的COM对象,COM规范对接收器的实现没有任何限制
        6.1.2可连接对象的基本结构
        可连接对象通过接口IConnectionPointContainer管理所有的出接口。对应每一个出接口,可连接对象又管理了一个
        成为连接点(connection point)的对象,每一个连接点对象实现了IConnectionPoint接口,客户通过连接点对象建立
        接收器与可连接对象的连接。可连接对象支持多个出接口,每个出接口支持多个与接收器的连接.
        在接口IConnectionPointContainer的成员函数中使用一个枚举器(IEnumConnectionPoints)暴露出此对象所支持的所有出接口,
        在接口IConnectionPoint中也用一个枚举器(IEnumConnections)管理它所连接的接收器

        6.1.3客户方基本结构
        一般可连接对象不应该向接收器对象请求其他的接口,即不应该调用接收器的QueryInterface成员函数。
        接收器对象是客户程序的内部对象,不通过类厂创建,也不需要CLSID
        客户方控制接收器对象和连接点对象如何建立关系
    6.2    实现可连接对象
        6.2.1    枚举器
            COM规范中,枚举器只是一个概念,没有确定的接口用于规定枚举器的各项操作,不过还是给出了一个
            一般性操作的枚举器接口模板。
            枚举器对象是一个内部对象,只需暴露枚举接口,不需要CLSID和类厂           
        6.2.3   
            每个连接点对象对应一个出接口,一般情况下它只实现IConnectionPoint接口

        6.3.2    事件的激发和处理
            事件既可又源对象的入接口成员函数激发,也可以由用户的某些操作引起,还可以由其他对象和客户调用引起,
        6.3.3   
            出接口是可连接对象与客户之间的通信约定,客户方的接收器实现出接口,而源对象通过
            连接点对象调用出接口的事件成员函数
        skipped 6.4

7    结构化存储
    COM定义了结构化存储的规范,包括一组接口和实现这些接口成员函数的一些规则,同时COM也提供了结构化存储的实现,即复合文档技术
            总之,在源对象执行过程中,根据需要都可以激发事件或向客户发出请求,事件和请求在程序逻辑上完全一致
        7.1.2   
            COM库提供了结构化存储的实现,它提供了一组接口和API函数供组件程序调用
            结构化存储定义的存储对象和流对象由COM库实现。
            流对象是一个由COM实现的组件对象,它实现了基本的COM接口IStream,应用程序通过
            IStream接口访问流对象,进行各种数据访问操作。
            存储对象是其子存储对象和子流对象的容器,只记录了这些子对象的信息,存储对象暴露IStorage接口,
            客户程序通过IStoage接口对存储对象进行操作,存储对象与目录类似。
            COM库负责得到指向根存储对象的接口指针

        7.2.3    命名规则
            根存储对象的名字就是复合文件的文件名。
        7.2.4    skipped

    7.3    结构化存储实现:复合文档
        结构化存储的一个实现版本:复合文档       
        7.3.1       
            LockBytes对象实际上是所有存储介质的一种抽象表达方式
        7.3.2    复合文档API函数介绍
            复合文档做为结构化存储的实现,不仅建立了LockBytes对象的概念,把根存储与底层的存储介质隔离开来,
            也实现了基于文件句柄和内存句柄的LockBytes对象
        7.3.3    零内存保存特性和IRootStorage接口
        7.3.4    存储对象,流对象和文件的CLSID信息
        7.3.5     复合文档与结构化存储
            结构化存储是COM规范的一部分,它描述了一个理想的存储机制,复合文档是它在
            windows平台上的实现,它利用操作系统的特点增加了一些新的特性,但也受到了一些限制
    7.4    永久对象实现
        7.4.1    客户程序通过永久接口维护永久对象的状态信息(skipped)
        7.4.2    永久对象的存储特性(skipped)

8    命名和绑定技术
    COM提供了另一种对象创建方法,通过名字对象(moniker)创建COM对象
    COM名字技术包括两个方面内容:-,命名技术
                    二,绑定过程,客户程序通过绑定操作获取组件对象,所以绑定过程是名字对象真正意义所在
   
    名字对象实现了标准的COM接口IMoniker,客户程序通过IMoniker接口获得组件对象
    skipped

    8.4    COM名字对象分类
        COM不见提供了命名和绑定机制,也实现了一组名字对象
    skipped

9    统一数据传输
    COM提供了应用之间数据交换的标准方案,统一数据传输(UDT,uniform data transfer).
    统一数据传输建立在结构化存储技术的基础之上,它通过一个“数据对象”来表达要传输的数据信息,
    统一数据传输的核心在于数据对象的定义和实现

    数据对象通过IDataObject接口暴露其内部信息,数据对象本身是一COM对象,IDataObject接口为应用程序进行数据传输建立了标准。
    在windows平台上,最基本的传输协议为剪贴板,拖-放,应用程序通常利用这两种协议获得数据对象。
    COM定义了数据结构STGMEDIUM用于描述各种存储介质。
    统一数据传输为应用之间建立了数据通信标准,而剪贴板和拖-放是两种最常用的数据传输协议。

    统一数据传输机制中使用的通知接收器要简单一些,它是由客户程序实现的内部对象,只需要实现IAdviseSink接口
    skipped具体内容

10    DCOM
    DCOM提供了一套复杂的列集和散集机制,它建立再RPC的基础上,由于RPC被定义为DCE标准的一部分,而DCE RPC定义了所有
    常用数据类型的数据表达式,即网络数据表示法(NDR,network data representation)

    DCOM协议也被称为对象RPC(ORPC),它建立再DCE RPC协议的基础上,可用于各种基于组件的分布式系统。
    skipped from 10.2.3

第3部分    COM应用与发展

11    自动化对象
    在实际应用开发中,很少直接建立在COM API和COM接口基础上进行设计和开发。
    建立在COM基础上的实用技术:自动化和Activex控制。
    自动化的核心是IDispatch接口。
    ActiveX控制实际上是自动化的超集,可以用来实现一些包含界面特性的组件对象。
    自动化对象的所有方法和属性调用都通过Invoke成员函数来实现。
    自动化技术有自己一套的数据类型,在实现自动化对象或者使用自动化对象时一定要使用自动化兼容的数据类型。
   
    11.1    自动化对象基础
        11.1.1    自动化的产生和发展
        11.1.2    属性和方法
        11.1.3    类型库和ODL
        11.1.4    IDispatch接口
        11.1.5    自动化兼容数据类型
        11.1.6    参数顺序,可选参数和命名参数
        11.1.7    IDispatchEx接口
    11.2    自动化对象实现
        11.2.1    类型库支持
        11.2.2    Invoke函数实现
        11.2.3    异常处理
        11.2.4    多语种--本地化
        11.2.5    用CreateStdDispatch函数实现自动化对象
    11.3    自动化对象应用
        11.3.1    双接口
        11.3.2    迟绑定和早绑定
        11.3.3    自动化集合对象
        11.3.4    以IDispatch作为出接口
        11.3.5    自动化控制器
    11.4    自动化对象编程
        11.4.1    MFC对自动化对象的支持
        11.4.2    COleDispatchDriver类
        11.5.3    在Visual Basic中使用自动化对象
    11.5    例子程序

12    ActiveX控制
    ActiveX控制既是一个自动化对象,也是一个标准的COM对象,同时也是一个界面元素,如同Windows的普通控制一样
    12.1    ActiveX控制基础
        12.1.1    实地激活(in-place activation)
            为了实现实地激活特性,要求OLE对象和包容器程序之间必须遵守严格的接口约定
        12.1.2    属性页(property page)
            属性页时OLE的一项技术。
            属性页本身时通过COM对象实现的,属性页与它所表达的对象可以时分离的。
            如果一个COM对象要支持属性页特性,那么它必须实现ISpecifyPropertyPages接口。
            客户如果有一个或多个支持属性页特性的COM对象,就可以调用OleCreatePropertyFrame创建一个属性表对话框。
            在整个属性页技术体系中,客户程序,属性页对象,COM对象3者通过COM接口进行联系。
        12.1.3    属性变化通知
            OLE提供了一个专用于属性变化通知的接口IPropertyNotifySink,使用了可连接对象机制,以IPropertyNotifySink接口作为对象的出接口。
    12.2    ActiveX控制结构   
        12.2.1    ActiveX控制基本结构
        12.2.2    包容器基本结构
        12.2.3    IOleObject和IOleClientSite接口
        12.2.4    IOleControl和IOleControlSite接口
        12.2.5    用于ActiveX控制的标准分发ID
        12.2.6    ActiveX控制的其他一些特点
            ActiveX控制有关的注册表事项
            1)CLSID键下包含"Control"子键,表明这是一个ActiveX控制,
            2)ToolBoxBitmap32,也位于CLSID键下
            3)MiscStatus
            4)Insertable
    12.3    ActiveX控制与Internet
        12.3.2    包装ActiveX控制
            object标记的codebase属性指定控制的代码位置
        12.3.3    许可证管理
            lpk文件, IClassFactory2
        12.3.4    Web页面中ActiveX控制的初始化
            object标记的data属性中指定包含属性数据文件的URL文件名。
            可以在HTML语言中使用PARAM关键字对ActiveX控制的属性进行赋值。
        12.3.5    脚本支持与初始化安全性
            ActiveX控制提供安全性的关键在于IObjectSafety接口
    12.4    ActiveX控制开发和应用       
        MFC类库,ATL模板库,BaseControl框架
        skipped

13    基于COM的程序设计
    13.1    组件化程序设计
        接口时组件之间的协议。
        组件程序设计方法特点:
        编程语言和开发环境的独立性,
        组件位置透明性,
        组件的进程透明性,
        可扩充性,
        可扩展性,系统一级的公共服务,。。。。。。   
        组件化程序设计需要一种功能全面的组件体系结构。
    13.2    MTS介绍
        MTS为分布式应用提供了底层的基础设施,它把应用系统的客户程序与应用组件对象以及各种资源有机的组织起来。
        MTS对象是指运行在MTS环境中的COM对象。
        MTS使得COM成为企业应用或者分布式应用的基础结构。
    13.3    多层软件结构
    13.4    用COM设计WEB应用   

14    COM+

 

原文转自:http://hi.baidu.com/easyshare/blog/item/5bf1252dea61cb36349bf792.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值