转贴:COM/DCOM的思想体系(作者:品雪)

jiangtao
CSDN创始人·极客帮创投合伙人
博客专家认证
业界专家认证
2000-01-22 11:47:00
加精
问:
我现在在学COM(组件对象模型),用的是《COM/DCOM编程指南(清华)》,我看了1/5,觉得头疼,规矩太多,繁文缛节。比如说什么容器和聚,它画的图我看不太懂。书上的废话也很多。谁能给我一点建议吗?

答:
建议你去看看俺主页上关于corba的文章(http://pinxue.yeah.net里的bcb部份)对于了解组件对象模型会有所帮助的,corba的体系比dcom的要简洁些,我感觉有了这个基础再回头学dcom就简单多了。

组件对象模型的主要思想,简单点说,是一种对象封装说明的技术。假定你已经理解了OO的基本思想,COM/DCOM和CORBA都提供了下边的体系:
界面/接口 <==> 类
界面/接口相当于类的一份说明书,它是对于类的一部份相关的属性或方法的说明(在COM中只有方法)。一个接口可能在多个类中得到实现(这个类称为接口的实现类,而一个类中也可以实现多个接口。

只要知道了一个类实现了某个接口,那么就可以使用该接口来获取所感兴趣的信息或执行特定操作。比如我们知道IVersion接口中有GetMajorVer方法可以取得主版本号,而CAnimator和CNetSender类都实现了这个接口,就可以调用它们的对象的GetMajorVer方法取得该信息。而IDraw接口中有DrawInWin(Hwin),CAnimator和CPicture中实现了IDraw接口,则可以调用其对象的相应方法进行绘制。

指定这种结构可以很好的实现plugin机制,COM的目标之一就是把windows变成一个由各种软件模块拼成的灵活系统。我们定义好一套编辑器应该实现的接口,实现了这些接口的编辑器,不管是Word还是wps都可以很好嵌入到系统中,而我们在开发软件需要使用编辑器时也不必再开发一个,使用这些接口来操纵系统中安装的那个就是了。系统收到对编辑器对象的调用之后就会从注册表中找到该对象所在的文件,把它激活。

当然,这还是一种理想,如果你全套用M$的产品还行,否则……

DCOM则是对COM的进一步扩展:
Server and Server Proxy <==network==> Client Proxy and Client
COM中的各种软件对象都是驻留在某个文件夹中的,系统通过注册表中记录的信息去查找、激活它们;而DCOM则允许这些对象保存在网络中别的机器上。那我们在程序中怎么与不在本机上的对象交互呢?DCOM提供一种代理机制(Proxy),在客户端它会根据对象实现的接口的描述(IDL语言)生成一个空壳子类,该类的对象只管把用户的请求打包,然后到网上找到一个用户所需的对象,再把数据包发给该对象(server),并且将server返回的数据包解码;而在服务器端也会生成类似的空壳子类,负责将客户请求包解码,把结果编码返回。

中间过程我们不用担心,DCOM技术会自动处理,我们需要的是提供服务器对象的接口说明,开发工具会自动生成这两个代理,通常我们把客户端的称为存根(stub),服务器端称为框架(skeleton)。

举个电视机的例子,

COM电视机要包括电源、信号接收、用户操作面板等模块,不同的人关心的方面并不同,如使用者只关心用户操作相关的方法。这样我们就可以给电视机写好几本说明书,给用户一本操作方法说明,给电工一本电源接口说明书,再来一本信号接收接口说明书,以备更换信号接收部件时参考。
也就是说我们需要定义IUserControl接口,IPower接口,ISignal接口,IDisplay。当用户用IUserControl.PowerOn打开机器后,该方法会调用IPower.Supply供电,然后机器会自动用ISignal.Accept(Band)接收信号,用IDisplay.ScreenOutput显示到屏上。

而DCOM电视机则更是一台网络电视,可能它的显示部件是挂在客厅里的等离子平板,信号接收系统是租用的小区物业管理公司的,所以机器直接调用的ISingal.Accept(Band)只是一个存根对象,如主电路板上的一组电路,它们把Band数据和客户信息(如ID等)封装到数据包中,利用智能大厦中的光纤网络传给小区控制中心的电视信号接收中心,中心的框架设备把收到的信号解码,传给真正实现ISignal界面的CTower,CTower把指定频带的信号解调之后送给框架对象,框架对象再把这些信号打包,回传给存根,存根收到后解包,再调用IDisplay.ScreenOutput(DATA),这时它调用的IDisplay也是一个存根,又来一次IDisplayStub<-->IDisplaySkeleton<-->IDislay,这时候屏幕上终于可以显示出图像了。虽然DCOM电视机的过程复杂,效率不高,但是灵活,不用每家都买一套昂贵的卫星接收器了,而且可以在提供ISignal的租用服务器的多家公司中选择合意的,毕竟有竞争才能有不断改良的服务嘛。而显示屏则可以随时更换,只要它实现的IDisplay符合标准,今天TFT明天CRT,高兴了租一个72英寸的搞搞聚会也不错。

以下是DCOM电视机界的最近发生的几件大事:
2003年1月,TVSUN的TVJAVA牌彩电率先发布,成为彩电工业的事实标准;同年3月TVM$的产品TVJ1型彩电上市,支持TVJAVA标准,但由于易掉帧闪烁销路不佳
2004年3月,TVSUN发布TVJAVA2型彩电,造型美观,跨平台支持Nt9x/PALinx等59种制式,接收显示速度比上代产品提高60%,大受欢迎。
2004年9月,TVM$的TVJ6型彩电面市,兼容TVJAVA2标准,但只支持N制式,并利用N制特点研发了TVJAVA.TVM$.TVWIN32扩展,该项专利技术使信号接收显示速度比TVSUN的产品高出30%,配合人体工程学遥控器,TViMac可选彩色透明外壳,且价格仅为TVSUN产品的1/3,销路极佳,大受欢迎,加上二个月的免费赠送促销,成为市场主流。
2004年11月,大量用户发现购买的VJ6型彩电无法接收CCTV等频道的节目,TVM$称这是由于CCTV信号与TVJAVA.TVM$.TVWIN32不兼容,花$1998打个Patch即可解决。
2004年12月,大量电视台开始制作使用TVJAVA.TVM$.TVWIN32扩展的节目
2005年1月,默默无闻的TVScape公司的TVNavigatorGold彩电显示器集TV技术之大成,物美价廉,成为市场霸主,TVM$宣布准备与之合作开发完美的TV产品。
2005年8月,出乎众人意料的,TVM$宣布随TVJ6型彩电送TVExplorer3型显示器。但3型显示器质量较差,显示的图像怪异,不能显示白色会变成粉红色,大量用户选用TVM$+TVScape的组合,而将TVExplorer3做为应急备件,反正也不花钱。TVScape公司不久也宣布对个人使用免费提供显示器。
2005年12月,TVM$推出TVExplorer4型显示器,并且不顾用户反对,将TVE4与TVJ6集成销售,从这种系统中拆除TVE将使TVJ6罢工,但IDisplay接口还在,可以外接其它显示器。由于TVE4做得确实不错,质量接近TVScape产品,大家开始接受使用,部份用户反应集成确实方便。但该种显示器体型巨大,一般家庭没有空间再安装第二台显示器。
2006年1月,大量使用TVSUN公司TVJAVA2型彩电的用户投诉无法接收使用TVWIN32扩展的CCTV等多家重要电视台节目;TVNetscape公司首次出现亏损。
2006年6月,TVSUN、TVScape等联合将TVM$送上TV最高法庭,TVIBM、TVIntel出庭指证TVM$使用垄断优势进行不正当竞争法动
2010年1月,TV最高法庭裁定TVM$垄断成立,强制将TVM$分解成TVM$TV和TVM$Display两家公司。

--
※ 来源:.网易虚拟社区 http://club.netease.com.
...全文
1567 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolmantis 2001-11-11
  • 打赏
  • 举报
回复
good
IdShuLin 2001-09-20
  • 打赏
  • 举报
回复
good.The article is so excellent that I have the impulse printing it!
haha

xiao_tian 2001-04-25
  • 打赏
  • 举报
回复
先看看C++ 和windows 体系的书对理解com+ 有帮助,现在书已经更新了应该是
Inside com+ micorsoftpress
Stone 2000-03-16
  • 打赏
  • 举报
回复
Very Good!
King 2000-03-15
  • 打赏
  • 举报
回复
..
softdoctor 2000-03-15
  • 打赏
  • 举报
回复
说的好!
snowhust 2000-03-05
  • 打赏
  • 举报
回复
你和我看的书一样,我是刚刚开始学习COM,以后多切磋!
EMAIL:snowhust@cmmail.com
sadpacific 2000-02-23
  • 打赏
  • 举报
回复
关注。
kelvin 2000-02-16
  • 打赏
  • 举报
回复
It's as easy as a pie.
Modify it like this: g_hModule = (struct HINSTANCE__ *)hModule ;
and it will does work.
rober 2000-02-16
  • 打赏
  • 举报
回复
"Inside Com"里面的Chap07关于类厂的实例编译不了,是DllMain函数中的g_hModule=hModule该句出错,请问如何是好?
Limage 2000-02-15
  • 打赏
  • 举报
回复
:"Inside COM" (Dale Rogerson Microsoft Press) is the best I've ever seen. And it easy to understand.
kelvin 2000-01-27
  • 打赏
  • 举报
回复
"Inside COM" (Dale Rogerson Microsoft Press) is the best I've ever seen.
LaoZheng 2000-01-22
  • 打赏
  • 举报
回复
好!!!
zdg 2000-01-22
  • 打赏
  • 举报
回复
我正在看这本书, 我认为有一定的基础看这本书很是比较合适...

品雪网友的时间表很有意思, 不知道这次Microsoft是否能真的分成三瓣...
kxy 2000-01-22
  • 打赏
  • 举报
回复
有趣.

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧