加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

COM组件开发知识重点——COM原理与应用篇(一)

(2016-02-18 20:30:30)
分类: COM
第1章 概述
    COM组件可以是一个Dll(进程内组件),也可以是一个EXE(进程外组件)。进程内组件就是组件和客户程序在同一进

程内,进程外组件即组件和客户程序分别有自己的进程空间。
    一个COM组件可以包含多个COM对象,一个COM对象又可以有多个接口。
 
第2章 COM对象和接口
2.1 CLSID和IID
    对于COM对象来说,接口是它与外界进行交互的唯一途径。
    每个COM对象,可以用CLSID来标识,COM对象的每个接口可以用IID来标识。CLSID和IID都是128位的标识符GUID,是一

个随机数,可以由两方面特性来保证:空间(如网络适配器地址)和时间。
    GUID可以通过COM库的API函数生成:
HRESULT CoCreateGuid( GUID * pguid );
2.1.2 COM对象和C++对象的不同
COM对象的数据成员封装以组建模块为最终边界,对于对象用户是完全透明的、不可见的,用户必须通过接口方法来访问数据

成员;C++对象的封装特性只是语义上的,用户可以直接看到数据成员。
2.2 COM接口结构
接口是包含了一组函数的数据结构。客户程序利用这些函数获得组件对象的服务。接口成员函数中的字符串变量必须使用

Unicode字符指针。
客户程序用一个指向接口数据结构的指针来调用接口成员函数,接口指针又指向pVtable(指向vtable的指针),pVtable指

向一组函数,称为接口函数表(虚函数表vtable),表中每一项为4个字节长的函数指针,每个函数指针再指向函数的具体实

现。
2.2.2 接口描述语言IDL
2.3 IUnknown接口
COM定义的每个接口都必须从IUnknown接口继承过来,因为IUnknown接口提供了两个重要特性:生存期控制和接口查询。

QueryInterface用于查询COM对象的其他接口指针,AddRef和Release用于对引用计数进行操作。
在COM对象级实现引用计数,精细度比较合适。
 
2.3.1 使用引用计数规则
(1)函数的参数中使用接口指针变量。
输入参数:在被调用函数中,不必调用AddRef和Release函数。
输出函数:在被调用函数返回之前,对输出参数调用AddRef,增加引用计数。
输入-输出参数:在参数被修改之前,对原来传进来的接口指针调用Release,引用计数减1,在参数被修改之后,对新的接口

指针变量指针调用AddRef,若在函数执行过程中,参数没有被修改,则不必调用AddRef和Release函数。
(2)局部接口指针变量。
在局部函数块中,一个局部接口指针变量被赋了值并调用了接口成员函数,则对该局部接口指针变量不必调用AddRef和

Release函数。
(3)全局接口指针变量。
在把全局接口指针变量作为输入参数传给某个函数之前,调用AddRef,在函数返回之后调用Release。
(4)C++中类成员变量为接口指针变量:适用于(3)。
(5)在顺序执行过程中,如果对一个接口指针变量赋值,则对赋值后的接口指针变量调用AddRef,如果赋值前的接口指针变

量还没有结束,则赋值前必须对它调用Release以便先结束它的使用。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有