COM编程技术基础

一:

    客户程序在与COM组件进行交互时,只需知道与哪个COM对象进行交互即可,而不必关系组件模块的具体名称和位置,即COM对象的位置对客户是透明的。客户将通过128位的GUID来完成对象的创建和初始化工作。对于COM对象,此全局标识符也被称作CLSID。

     创建GUID可以使用COM库提供的CoCreateGuid()API函数,每一个注册了的COM对象在系统注册表的HKEY_CLASSES_ROOTCLSID子键下均对应一个以CLSID的字符串形式命名的子键。在此子键下,通过COM库可以得到所需要的信息并完成对象的创建。

      除了CLSID可以唯一标识一个COM对象外,也支持通过组建对象名对COM对象的标识。此标识信息称为ProgID(程序标识符),通过在以CLSID的字符串形式的子键下存在有ProgID子键。通过ProgID子键的CLSID值和CLSID子键的ProgID值可以将CLSID和ProgID建立起联系。在程序中也可以通过CLSIDFromProgID和ProgIDFromCLSID进行互相转换。

二:

      类厂所支持的用以创建组件的接口是IClassFactory,该接口从IUnknown派生,并具有两个自己的接口成员函数CreateInstance和LockServer,这两个成员函数分别用以创建COM组件对象和控制组件的生存期。

      创建类厂的CoGetClassObject()函数将接收一个CLSID作为参数并返回指向类厂对象IClassFactory接口的指针。客户将可以通过此指针来创建所需要的组件并返回某接口的指针。通过此指针,客户将可以直接调用新创建的COM对象接口的成员函数,从而获得COM对象的所有服务。

      如果COM对象是进程外组件(拥有独立的进程地址空间,通常多以EXE形式存在),则CoGetClassObject()将要首先启动组件进程,并一直等待到组件进程通过CoRegisterClassObject()函数将类厂注册到COM后,才会返回COM中相应的类厂信息。一旦组件进程退出,此注册的类厂对象也就不再有效,需调用CoRevokeClassObject()函数予以通知。

     客户程序对COM组件的调用主要分为进程内组件调用和进程外组件调用两种情况,具体过程上没有太大区别。为了能够使用COM库提供的API函数,首先要使用CoInitialize()初始化COM库。

     虽然通过CLSID和ProgID都可以标识一个组件,但ProgID显然要比CLSID更易于理解和使用,因此通常很少直接使用CLSID,而是通过使用CLSIDFromProgID(),根据ProgID得到组件的CLSID。进而以此返回的CLSID作为参数去调用CoGetClassObject()以创建类厂对象并返回类厂接口指针。通过该指针调用类厂对象的CreateInstance()接口成员函数,执行结果将创建与CLSID相应的组件对象并返回IUnknown接口指针。通过此接口的QueryInterface()成员函数将能够进一步获过程将是隐含进行的,使用更为简单。取组件的其他接口指针,从而使用组件提供的各种服务。

      对于接口,通常采用抽象基类来定义,并利用类的多重继承来实现该组件。

http://soft.zdnet.com.cn/software_zone/2007/1020/568471.shtml

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值