组件对象模型与ATL实现

一 概述

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

本文不是讲解COM是什么的文章,也不是讲解如何进行ActiveX编程。我在这里要描述的是如何应用COM技术,建立类似于DOM(Document Object Model)的内容。也就是使用COM实现设计模式方面的问题。何谓设计模式,说白了,就是一种模型——在COM领域称为对象模型,它由一组互相关联的COM对象组合而成,存在于同一个类型库(type library)中,基本以DLL的面目出现。比如,搞地理信息系统的人耳熟能详:MapObjects(MO)、ArcObjects(AO)、SuperMap等等。这些东西是什么?它们就是使用COM技术实现的模式——对象模型。微软使用COM实现了W3C的XML解析器标准。一个HTML文件在浏览器(Internet Expolorer,IE)内部被实例化成DOM模型——一种典型的树状结构。使用JavaScript的人比较熟悉的window、document这些对象都是DOM中的组件。我要讲的就是,如何在架构的层次上实现上面这些东西。

作为一名COM程序员(当然不仅仅是开发COM,我就要同时写Web Services、网页、JavaScript AJAX、OpenGL、ACE、图形算法、Oracle OCI、C/C++等各种程序),必须精读过下面3本书,这也是我这篇文章的主要参考书:

1)COM技术内幕(Inside COM——by Dale Rogerson);

2)ATL技术内幕(ATL Internals——by Christopher Tavares, Kirk Fertitta, Brent Rector, Chris Sells);

3)COM本质论(Essential COM——by Don Box)。

其中,第2本书《ATL Internals》的——第8章 集合和枚举器——尤其是你必须弄清楚的,即:

Chapter 8. Collections and Enumerators。

原理在那里讲的很清楚了,我只是依样画葫芦告诉读者该如何应用。因为有必要指出的是:按照《ATL Internals: Working with ATL 8, Second Edition》一书的讲解例子,会出现编译不通过的情形。所以,我的实现或许对你有帮助。而且,系统提供的atlcom.h头文件实现的集合索引是从1开始的,这对我们习惯了从0开始的家伙,就如同让惯用右手的人使用左手吃饭一样不方便。我把它也一道改为0-based。

时间: 2024-09-20 00:02:21

组件对象模型与ATL实现的相关文章

组件对象模型与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

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

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

组件对象模型的规则

摘要 本文的目的是为使用和实行Microsoft的组件对象模型(COM)提供迅捷的参考.读者若想更好的理解什么是COM,以及隐藏在它的设计及体系中的动机,应该阅读组件对象模型的技术说明书(MSDN库,技术说明书). 规则1:必须实现Iunknown 如果一个对象没有至少实现一个最小程度为IUnknown的接口,那它就不是Microsoft的组件对象模型(COM). 接口设计规则 接口必须直接或间接地从IUnknown继承. 接口必须有唯一的识别(IID). 接口是不变的.一旦分配和公布了IID,

VC ATL专题

ATL的GUI程序设计(前言) ATL的GUI程序设计(2) ATL的GUI程序设计(1) ATL/COM简单工程 ATL COM和ADO VC++与MATLAB混合编程及其应用 MATLAB与VC++混合编程实现一维小波多尺度分解. 基于VC++中ATL创建ActiveX控件的探讨 精通VC与MATLAB联合编程<十>--综合举例二 精通VC与MATLAB联合编程<九>--综合举例一 精通VC与MATLAB联合编程(八) 精通VC与MATLAB联合编程(七) 精通VC与Matla

COM组件

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

STL,ATL,WTL之间的联系和区别

STL即 Standard Template Library (标准模板库)         STL是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Lee和David R Musser在惠普实验室工作时所开发出来的.现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间.        STL的代码从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代器),几乎所有的代码都采用了模板

用ATL开发和部署ActiveX网页控件

用ATL开发和部署ActiveX网页控件 摘 要 ActiveX插件技术广泛的运用于B/S系统中,本文通过一个项目实例,详细介绍用ATL开发和部署ActiveX网页控件的过程.学习使用ActiveX让浏览器访问客户端的硬件资源. 关键字 ATL,ActiveX控件,COM组件     一.前言 在B/S结构的系统中,出于安全性考虑一般不准许浏览器访问客户端的硬件资源,如控制打印机,照相机等.对于一个完善系统来说,往往很多时候又需要控制这些资源.通过在浏览器中插入ActiveX插件是一种很好的解决

com组件-COM组件和NET有什么不同?

问题描述 COM组件和NET有什么不同? 1.我用VS2012 - MFC写的程序,设置下,就能在未装NET框架的XP使用,不是说windows操作系统的各版本内核不同,才推出的net框架吗? 2.COM和NET有什么不同之处? 3.学习COM现在还有用吗?如果我只想调用别人的COM组件,不想自己写COM组件是不是就不用学了? 4.如果还得学COM的话,因该学MFC自带的COM支持,还是学ATL库? 5.DLL不能代替COM思想吗?我听说COM是种思想,支持DLL.可DLL不也支持各种语言之间调

【转】用ATL开发和部署ActiveX网页控件

from:http://hi.baidu.com/zifan/blog/item/ea050df35bfa5dc10a46e022.html2009-09-25 17:02摘 要 ActiveX插件技术广泛的运用于B/S系统中,本文通过一个项目实例,详细介绍用ATL开发和部署ActiveX网页控件的过程.学习使用ActiveX让浏览器访问客户端的硬件资源.关键字 ATL,ActiveX控件,COM组件 一.前言在B/S结构的系统中,出于安全性考虑一般不准许浏览器访问客户端的硬件资源,如控制打印机