组件对象模型的规则

摘要

本文的目的是为使用和实行Microsoft的组件对象模型(COM)提供迅捷的参考。读者若想更好的理解什么是COM,以及隐藏在它的设计及体系中的动机,应该阅读组件对象模型的技术说明书(MSDN库,技术说明书)。

规则1:必须实现Iunknown

如果一个对象没有至少实现一个最小程度为IUnknown的接口,那它就不是Microsoft的组件对象模型(COM)。

接口设计规则

接口必须直接或间接地从IUnknown继承。

接口必须有唯一的识别(IID)。

接口是不变的。一旦分配和公布了IID,接口定义的任何因素都不能被改变。

接口的成员函数应该有HRESULT类型的返回值,使远端结构可报告远程过程调用(RPC)错误的情况。

接口成员函数的字符串参数应该是Unicode。

实现 IUnknown

对象的同一性。这要求对任何特定IUnknown接口的给定对象实例的QueryInterface调用返回相同的物理指针变量。这导致了所谓的两个接口的QueryInterface(IID_IUnknown, ...)和结果的比较,以确定它们是否为同一对象(COM对象同一性)。

静态接口的设置。任何经由QueryInterface来访问对象的接口的设置,必须是静态而不是动态的。也就是说,假如一旦QueryInterface获得了一个给定的IID,那么它总是对相同的对象(除非有意想不到情况)调用,假如QueryInterface不能获得一个给定的IID,那么随后对相同IID的对象调用必定会失败。

对象完整性。对于可处理的接口设置,必须有反身性,对称性和过渡性。即给定代码如下:

IA * pA = (some function returning an IA*);
IB * pB = NULL;
HRESULT hr;
hr = pA->QueryInterface(IID_IB,&pB); // line 4
Symmetric: pA->QueryInterface(IID_IA, ...) must succeed (a>>a)
Reflexive: If, in line 4, pB was successfully obtained, then
pB->QueryInterface(IID_IA, ...)
must succeed (a>>b, then b>>a).
Transitive: If, in line 4, pB was successfully obtained, and we do
IC * pC = NULL;
hr = pB->QueryInterface(IID_IC, &pC); //Line 7
and pC is successfully obtained in line 7,then
pA->QueryInterface(IID_IC, ...)
must succeed (a>>b, and b>>c,then a>>c).

最小参考服务大小。我们需要实现AddRef来维护一个服务台,它足够大以便支持给定对象的所有接口的2 31 –1有出色的整体指示服务。一个32-位的无符号整型数满足要求。

Release并不意味着失败。假如客户想知道关于资源已被释放等情况,就必须在调用Release之前使用一些对象接口中的较高的语义。

时间: 2024-09-15 18:26:46

组件对象模型的规则的相关文章

对COM(组件对象模型)的理解及组件和的优点可能遇到的问题

用户需要什么样的软件产品?这是一个多选题,但高效,健壮是肯定会被选种的.作为一名软件开发人员如何做才能满足用户的需要呢?必须要保证升级应用时 不破坏与以前版本的向后兼容性.必须做到扩展系统服务时不依赖特定的操作系统.面向对象的程序设计显然是一次革命性的改变.采用面向对象的设计方法我们可 以很容易的把要解决的问题事物抽象成各种类,并将内部动作封装隐藏起来,只提供一些接口.但这并没有完全解决我们的问题.昨天我在<程序员>杂志上看到, 现在是后OO时代,那OO以后是什么呢?应该是面向组件吧. COM

组件对象模型与ATL实现补遗

组件对象模型与ATL实现文章写好了,但是遗漏了一个关键问题.就是还有一个需要修改atlcom.h文件的地方,我把它更正在这里.打开按上篇文章改正后的atlcom0.h,找到下面的函数: STDMETHODIMP IEnumOnSTLImpl<Base, piid, T, Copy, CollType>::Next 更正为(只需要改变粗体的地方,一句话而已 ) hr = Copy::copy(pelt, &*m_iter); 改为 hr = Copy::copy(pelt, *m_ite

组件对象模型与ATL实现

一 概述 微软组件对象模型(COM)的出现是软件工业发展的一个重要进步.尽管到目前为止,它还主要运行于微软(MS)的操作系统平台.无论对COM喜欢或厌恶,它都充斥着整个互联网和Windows的计算环境.COM以难学易用而著称,与它一起恶名昭彰的还有微软的另外一个名词--ActiveX,我们称为控件.等到你真正按照示例代码实现了一个PolygonCtl或BullEye控件的时候,你才真正理解了一点COM的思想和方法.COM是理论,ActiveX是技术.深谙COM的精髓,熟练掌握ActiveX编程技

COM组件

COM组件 COM component(COM组件)是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术.在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统.由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制:可以在多个应用系统中重复利用同一个组件:可以方便的将应用系统扩展到网络环境下:COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块. 目录 C

067_《Delphi7组件与分布式应用开发》

<Delphi7组件与分布式应用开发> Delphi 教程 系列书籍 (067) <Delphi7组件与分布式应用开发> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Pdf 作者: 飞思科技产品研发中心编著 丛书名: 开发专家之Delphi 出版社:电子工业出版社 ISBN:7505383426 上架时间:2003-2-17 出版日期:2003 年1月 开本:16开 页码:406 版次:1-1 内容简介 全书以组件与分布式应用开发为主题,贯穿实例深入浅

XMLHTTP组件相关技术应用资料

xml     一.数据库远程管理技术 基于互联网的广域网现代应用中的一个重要环节是数据库远程监控.首先简单回顾一下互联网上的数据库远程管理技术的发展过程和方式: 早期通过编写CGI-BIN程序模块进行数据库远程管理.但CGI-BIN的运行速度慢,维护很不方便,现在已经基本被弃用. 这几年使用组件对象模型(Component Object Model, COM)的应用非常多,效果也很好.但如果使用的是第三方服务器(笔者的网站就是建立在第三方的虚拟主机上),服务器方往往因为保密或其它商业原因不允许

Ajax核心:XMLHTTP组件相关技术资料

ajax|xml 一.数据库远程管理技术 基于互联网的广域网现代应用中的一个重要环节是数据库远程监控.首先简单回顾一下互联网上的数据库远程管理技术的发展过程和方式: 早期通过编写CGI-BIN程序模块进行数据库远程管理.但CGI-BIN的运行速度慢,维护很不方便,现在已经基本被弃用. 这几年使用组件对象模型(Component Object Model, COM)的应用非常多,效果也很好.但如果使用的是第三方服务器(笔者的网站就是建立在第三方的虚拟主机上),服务器方往往因为保密或其它商业原因不允

XMLHTTP组件相关技术资料

xml 一.数据库远程管理技术 基于互联网的广域网现代应用中的一个重要环节是数据库远程监控.首先简单回顾一下互联网上的数据库远程管理技术的发展过程和方式: 早期通过编写CGI-BIN程序模块进行数据库远程管理.但CGI-BIN的运行速度慢,维护很不方便,现在已经基本被弃用. 这几年使用组件对象模型(Component Object Model, COM)的应用非常多,效果也很好.但如果使用的是第三方服务器(笔者的网站就是建立在第三方的虚拟主机上),服务器方往往因为保密或其它商业原因不允许用户注册

手把手教你使用VB来创建ASP组件

创建 一.什么是组件 组件是包含可以更改的数据形式的代码的对象,是可用代码的封装,这些代码可以用来执行应用程序的一些功能,如从数据库中检索某些信息等功能.现在经常听人说起COM,其使它的意思是组件对象模型(Component Object Model),是由微软开发的可以在Windows平台上执行的对象模型,COM定义了组件之间的交互能力.为COM编写的组件可以重复使用,并不依赖于编写所用的语言,比如说,一个组件可以用VB,VC++甚至是Java来编写,总之,只要遵守COM规范就可以了. 二.为