Welcome

首页 / 软件开发 / C++ / 理解COM套间

理解COM套间2010-11-29junguo简序

大学毕业前的最后一学期,在一家公司实习,当时的工作需要用 到一些操作系统提供的组件。那时候只知道COM这个名词,并不知道到底是怎么 回事,只知道上网到处找别人的源码解决自己的问题;那段日子到现在回忆起来 都是灰色的,每天呆坐在电脑前,一个网站一个网站的查找自己需要的源码。但 并不清楚自己到底在做什么;那时候对自己能不能成为一个程序员充满了怀疑。 在实习结束返校的火车上,一夜间,我把一本《COM本质论》翻看了120多页。当 我和当时的女友吹嘘自己一夜可以看100多页书的时候,她马上问我:看懂多少 ?当时我哑口无言。她忍受不了我那段日子的失落和抱怨,从那时候起,我们结 束了那段简短的感情。到如今我还在一个人漂泊着,而上周她成为了别人的妻子 。想不到用什么方式去纪念我迄今为止经历过的唯一一段感情,我和她的感情并 不完全是因为COM结束的,但由于对COM的迷惑,使我走向了迷茫,失落;对自己 失去了信心,在她面前变成了一个悲观失望的人。写这篇文章权当对这份感情的 一份纪念吧。

企者不立,跨着不行。很多格言都告诉我们做什么事情都 必须从基础开始,对COM的理解也是这个道理。当三年前我看《COM 本质论》的 时候,对虚函数也只是一知半解,只是知道通过它可以实现多态。但到底怎么实 现就不清楚了。看不懂COM太正常了。知道看过Stanley B.Lippman的《Inside the C++ Object Model》,对C++的内存结构有了基本的理解,我才明白了接口 的意义。这篇文章是写给初学者的,顺便给大家一些建议,如果一本书你看不懂 的时候,可以先放放,先找一些基础的读物来看看。这样可以少走一些弯路。

Don Box 在《COM 本质论》中说,对接口,类对象和套间有了彻底的理 解,那么使用COM,没有翻不过去的山头。如果你对C++有深入的理解,那么 《COM本质论》中对接口和类对象的阐述很清晰,理解并不困难。但套间是一个 比较抽象的概念,而书上对这部分只是理论的叙述,没有提供具体的例子,理解 起来就更困难了。在此我把自己找到的一些例子和自己的理解总结以下,以期给 初学者提供一些入门的方法。闲话打住,开始正文吧。

一、关于多线程 (Multithreading)

子曰:本立道生。也就是说我们明白事物所存在的 原因,自然也就明白事物是怎么回事了。如果我们清楚了套间(Apartment)的产 生原因,再去理解套间,就容易许多了。我们先来看看,为什么需要套间?套间 是为解决多线程中使用组件而产生的,首先我们来了解一下多线程。

1、 理解进程(Processes)和线程(Threading)

理解线程,先从进程 (Processes)开始,一般书上对进程的描述都比较抽象,都说进程是一个运行 的程序的实例,进程拥有内存,资源。我这儿试着用一段汇编程序来解释一下进 程,看看能不能帮你加深一下印象。我们先来看一段简单的汇编程序(你不理解 汇编的话,建议找本书看看,一点不懂,很难对其它高级语言有太深的理解 )。 ; 汇编程序示例
data_seg segment ;定义数据段
n_i dw ?
data_seg ends

stack_seg segment ;定义堆栈
dw 128 dup(0)
tos label word
statck_seg ends

code1 segment ;定义代 码段
main proc far
assume cs:ccode,ds;data,seg,ss:stack_seg
start:
move ax,stack_seg ;将定义的堆栈段的地址保存到ss
mov ss,ax
mov sp,offset tos ;将堆栈的最后地址保存到sp,堆栈是从下到上 访问的

push ds ;保存旧的数据段
sub ax,ax
push ax

mov ax,data_seg ;将定义 的数据段保存到ds
mov ds,ax

call fact ;调用子函数

……. ; 其它操作省略
ret ;返回到系统
main endp

fact proc near ;子函数定义

…… ;具体操作省略
ret ; 返回到调用处
fact endp

code1 ends
end start
示例1:汇编程序结构