序:
开篇帖子来讨论,于我而言,希望这些将留下的讨论,能有留下的价值,若干年后,某一新人偶然拾得这篇口水与板砖乱飞的文字,能从中看到一两句印象深刻的话,如果能因此而触发一些顿悟,几乎是可遇而不可求的想法了。于大家而言,技术以外,大家可以舒展筋骨,尽情八卦,将自己的心得,体会,埋怨,冤屈都一一倒在这里。成天板着脸,咬牙切齿地写程序,慌不择路的回复帖子,对自己的成长不利,对同事的眼球不利。
我规定的主线诚如题目,但根据社区一贯的跑题精神观之,前景不容乐观,所以外延是起码你得是说和编程相关的话。
COM已经发展了这么多年,有些程序先行者也做了那么多年,今天就闲谈趣话一番。
开篇帖子来讨论,于我而言,希望这些将留下的讨论,能有留下的价值,若干年后,某一新人偶然拾得这篇口水与板砖乱飞的文字,能从中看到一两句印象深刻的话,如果能因此而触发一些顿悟,几乎是可遇而不可求的想法了。于大家而言,技术以外,大家可以舒展筋骨,尽情八卦,将自己的心得,体会,埋怨,冤屈都一一倒在这里。成天板着脸,咬牙切齿地写程序,慌不择路的回复帖子,对自己的成长不利,对同事的眼球不利。
我规定的主线诚如题目,但根据社区一贯的跑题精神观之,前景不容乐观,所以外延是起码你得是说和编程相关的话。
COM已经发展了这么多年,有些程序先行者也做了那么多年,今天就闲谈趣话一番。
1.COM是什么?COM的年龄?
2.COM解决了什么?
3.COM的优缺点?
4.COM和.NET的关系?
5.COM的前景
6.征文:另一种风情
限写与COM有关的感受
只是没有做一种语言专门支持COM规范的, 用多种语言都可以实现COM对象, 但都有弊端, 为了解决各种弊端, 又出现各种COM编程技巧, 增加了COM的复杂性, 比如C++ 用它写COM对象需要对C++内存模型有比较好的掌握.模型是好的, 实现是复杂的, 使用是漫长的.
1.1.COM是什么?COM的年龄?
The Component Object Model组件对象模型。
Dale Rogerson在《COM技术内幕》中提到微软四年前提出COM的概念,写书的时间是1997年,那COM产生的时间大概是在93年左右。
从InstallShield 到了 MS?
写出自己的体会,满有意思:)
我们也要在产品中使用COM技术,十分想了解其在速度,稳定性方面对产品的影响,以及其优缺点期待下文!
还没想好,想好再说...
顶,哥们幽默诙谐,go on
COM的书是不好找了,因为是很老的技术了,很多书都绝版了
(我有些词中文不知道如何翻译,所以放英文了,见谅)扣回楼主的主题,谈COM的优缺点以及前景。这个题目有点儿大,好比“谈改革开放的优缺点”。像我这种COM半瓶子水的水平如果列出个一二三四,明天估计全国人民都笑了。另外谈到优缺点,这个主观的东西就多了,好比有人喜欢苗条的,有人喜欢丰满的。所以肯定是个砖头乱飞的题目。所以我就谈我自己的感受,见淫见妓,不对,是见仁见智。首先楼主问COM解决了什么问题。我觉得COM第一是解决了模块之间数据封装和隐藏的问题。当然这个C++的Abstract Class和Java的Interface也解决了。进一步,COM也实现了在这个基础上模块与模块之间,甚至是进程与进程之间(包括局部进程和其他机器上的进程)通讯的一个标准。和CORBA一样,COM首先把Client和Server端的实现分开(de-couple)。OO的一个很重要目标就是降低模块之间的coupling,COM和CORBA都是符合OO的这一精神。这样Server和Client端完全可以独立为政,只要是满足了他们之间的合同(IDL里面的Interface),具体如何实现,用什么编程语言,都无所谓。这个实现让开发大规模的程序更容易了。大家都知道,写100个100行的程序比写一个10000行的程序要容易得多。传统的程序,写Client端和写Server端基本要同一个开发团队,因为每方随便改变些东西,就会影响到另外一段。比如一个简单的例子数据格式,同样描述一个人的信息,可以用很多形式来表达,传统的通讯格式,Pipe也好,tcp/ip也好,都只认数据流,所以通讯的两端得规定好数据的格式,这个东西很繁琐,也很容易出事情,一出事情找起问题来也很麻烦。这个我自己有亲身体会,我上学的时候打工给人做一个OS/2上的软件,客户端搜集好数据以后,都传到一个Server机器上做计算。复杂的数据结构要变成数据流然后通过TCP/IP传来传去,经常出错的时候得一个byte一个byte地检查,很头疼。而COM的Marshalling(中文?)提供了一个标准的serialize 和 de-serialize的方法,这大大减轻了开发人员的负担,使得他们可以专心做自己的东西。这无疑提高了开发效率。如果说从C到C++是OO的一个里程碑,我觉得CORBA/COM等技术的出现应该是另外一个里程碑。还有一个解决的东西应该是C++缺少的类描述。给一个C++的Object,你无法知道它的Class是什么样子的,作为OO语言,C++缺乏MetaClass的支持绝对是个天生不足。其他一些流行的OO语言都有类似的支持,比如SmallTalk的MetaClass,Java和.net的Reflection。COM用IDispatch试图来弥补这个缺陷,当然解决得好不好个人观点不同,不过毕竟可以让Script语言能用COM,还是很有意义的。反过来也可以用数据来定义COM Object本身。比如InstallShield的Script语言里面用户定义的变量,可以通过COM来修改,Script的函数也可以由客户端直接调用,这都是通过实现IDispatch来做到的(当然是得自己实现,靠ATL那东西不行,是死的)。说到这个顺便提一下很多人说到VB的Client是用IDispatch,这个是不对的,VB/VC的Client因为效率考虑,都是直接用VTable的,VB Script是用IDispatch。不要搞混。说起COM的优点,当然首先是刚才提到的,它使得大规模软件更容易模块化了。一些OO模式的应用让设计,开发,维护都变得容易了很多,这些理论的东西大家都知道,我就不罗嗦了。除此之外,我很喜欢的就是COM这个二进制标准。一个COM组件写好后,无论是C++还是VB还是Script,都可以用(Java通过Jni也很容易)。头一个好处是测试容易了,比如我们开发的时候,都是用VB来测试,因为写起来比较快。另外一个好处就是一个东西写好以后,客户端的程序很容易延展。比如InstallShield的Build引擎(MediaBuildxx.dll) 是COM组件,IDE(C++)里面可以用,CabViewer(VB)可以用,大公司做Automated Build可以用 (VB/Java Script) ,等等,后来的用途不下十几种。而且一个带着Type Library的COM模块本身就是个帮助文件,比如我们当时用msxml的时候,微软的SDK里面还没有提供头文件。没有问题,拿OleView打开,一个Copy/Paste,问题就解决了。传统的DLL光看Export是无法知道函数的Signature和用法的。COM和其他现有的支持Component Module的技术相比,有一个很大的优点是本身是机器吗,不需要虚拟机(当然VB也可以写COM,这里拿C++比较),这有如下优点:
1. 执行速度高
2. 调试容易。任何带虚拟机的东西,一旦事情出在虚拟机里面,调试是很麻烦的,因为你不知道虚拟机是如何工作的。
3. Dependency少。虚拟机开发的东西,往往换了虚拟机以后,要么不工作,要么有行为变化。比如我们后来Java版的Installer,需要在10个平台一共56个虚拟机上测试,这个工作量是惊人的。COM的东西不会受到这些东西的干扰,NT上能跑的东西,放在2000各种SP,XP各种SP,基本上都不大会出问题。另外一个我比较喜欢的COM功能就是它把客户端和Server端弄透明化了。同样一个outproc server,既可以放到本机上,又可以原封不动放到其他机器上。关键是Client不知道,也不需要知道Server在什么地方,一个CoCreateInstance,其他的就交给系统了。一些小的功能,比如用IMoniker来实现Name到Object的Binding,也设计得很巧。用过InstallShield 6.0的朋友可能知道Installshield Object,就是事先封好的一些redistributable,比如DirectX,MFC,ADO等等,做安装程序的时候如果你的程序需要这些东西,就把这些Object加到你的项目里面。这些Object每个都是个小的COM Object, 需要不断更新,比如DirectX会不断出现新的版本,但是IDE和Build工具不会更新,所以无法用CoCreateInstance来找到它们,因为写IDE的时候,这些东西还没有出来。而且这些Object本身都是数据描述的,也没有什么CoClass (用另外一个COM软件来封装)。当时我解决的办法就是写了个实现IMoniker的小组件(ismk.dll),负责Name到Object的Binding。IDE和Build工具只需要向ismk提出请求:“嘿,这个顾客想要一个叫DirectX 9.0的COM Object”,其他跑腿儿的事情就不用管了,这样IDE和Build工具的设计就相对干净得多。还有一个优点应该是稳定性吧,大家知道,微软的OS大量运用COM(到Vista仍然如此),再加上这么多年好多COM的应用,这么大量的测试,COM本身的问题应该是比较少了。而其他虚拟机,比如Java,版本提升太快,测试跟不上,问题频出。每每提心吊胆。COM的优点肯定还有很多,随便翻本儿书应该比我在这里瞎扯总结得好。下面谈我感觉的COM缺点和心酸泪吧。
IDispatch这个作用能不能说详细一些?
这一点的确是很方便的
期待下文,下下文 ....
feimingbiao
1。从ATL开始学COM基本上是和从MFC开始学Windows是一样危害的
2。这个世界上很多事情,往往优点最后就是缺点,中文讲成也萧何,败也萧何,用洋文说是Live by the sword, die by the sword。
我觉得COM技术,把太多细节暴露在外面了,以至于勾引我看了很多ATL的源码。
但是到了出现问题的时候,又不知道所以然。感觉.Net实现取代COM实现,是一件好事,以后的程序开发变得简单了。
好多地方讲得通俗易懂,哈,都可以去写书了. :D
还有不少应用,我也做COM了一段时间,只是理解了常用的东西,像错误处理这些,根本没用,只是返回一个S_FAIL完事
能否说说.net的实际用途?反正.net作的程序,慢就一个字?用了SQL server管理端,那个慢啊!
难道就为了开发效率,来牺牲使用效率?
微软会否重新重视COM?
总结你对COM缺点的看法,就如同许多人理解对C++的看法--难!
但事情都有俩面--它难,但是因为它给你更多选机会。而这一点往往对开发产品很重要。
而且,随着你对所开发产品理解的深入,这些“更多选择机会”就更加显得重要!
所以我说COM更适用于产品开发,.net择则更适用于要求速度的产品开发。
////////////////////
这一点,我也是深有体会,一般来说,程序员特别是新手都没写错误处理的习惯, 一是懒,二是自信, 程序跑的结果不对,就得很辛苦地去跟源代码。要是MS能把API的错误查看接口(::GetLastError())扩展到COM里就好了,COM的错误走了自己的一套路数
难道ATL,WTL不算框架么?这一点不认同feimingbiao()
我以为,主要看其定位了.如果定位于底层开发的工具,没有那些框架是对的.
就像C++没有框架一样.感觉com气质有点象C++ :)
你们都说COM的线程不好掌握,怎么会呢?我觉的COM的线程规则很清晰呀
2。搜索,投入巨资,反正我还是用Google。
3。企业软件,这个东西不是会写程序就行了,得有商业模型,短时期内还是SAP和Oracle的天下。
4。家电,游戏:Windows Mobile, XBox, Zune, 不知道如何评价。
5。服务器市场服务器市场是微软现在最有可能突破的领域。实际上,在Vista出来之前的的几年,微软收入上升最快的领域就是服务器市场,养了微软4年,基本上是从Linux虎口拔牙。服务器和客户端不同,用户关心的不是泡泡卡丁车和视频聊天。更主要的是全套解决问题的方案。比如做网站的,主要关心数据库,Web Server(+AppServer),开发工具,MiddleWare的集合。高端的服务器UNIX+Orable/DB2,微软玩儿不了,所以只能在低端的打主意。这方面开源软件确实是个很大威胁。当然这个威胁不是来自王开源等人高呼的英特纳雄耐尔一定要实现,而是一些工业巨头利用开源人员的劳动果实谋自己的私利(很遗憾很多开源软件开发人员的血汗最后还是流到了资本家手里)。低端服务器这个二奶现在这么几家争:无产阶级:Linux + MySQL + Apache + PHP/JBoss + J2EE + (Jbuilder, IntelliJ, Eclipse,Emacs/vi 等等)
IBM: AIX/小红帽 + DB2 + Apache + WebSphere/JBoss + J2EE + Eclipse
Oracle: Linux + Oracle + Apache + OC4J + Fusion + JDeveloper
微软: Longhorn 2008 + SQL2005 + IIS + .net + Visual Studio无产阶级就不说了,IBM和Oracle,都是财大气粗,扔得起钱的主儿。不要说IBM还造硬件。这两家大概是最大的情敌,所以微软如果想追求这块儿,肯定得使劲花钱。说来说去,技术是次要的,最终的目的卖操作系统是真的。所以微软没有理由大力推广COM了。当然也不能扔,OS和Office毕竟都是COM,不能家里红旗倒了。
我现在还没有接触过com,但feimingbiao()的文章让我觉得没有再学的必要了,如果工作不需要,这部分东西还需要去了解吗
顶!!!
当你需要将client与server端分开,当你需要为你的程序提供开发接口,。你需要COM!
你需要COM!(欢迎接龙--当你××××时,你需要COM!)
看到过这么一段话:现在Win32编程很多,.Net开发速度快但是运行效率低了,ATL/WTL附带COM功能强大,但就是一个字:难。而MFC就尴尬了,一方面和COM一样麻烦,另一方面开发效率也不高。最重要的是运行就一个字:慢(相对SDK),而SDK又太原始……
好像忘了那段文章里到底是个什么观点了。反正既然百花齐放。我就坚持自己的观点吧,反正是个学生,没到大的项目开发,自己偶尔写个WinMain弄几个Switch/Case也不是不可以。偶尔赶赶潮流用用MFC快速开发(相对SDK)也无所谓。原始了点,但是安全。要是专心MFC万一哪天变天了那还不哭死?
结果在写一个自己用的小程序时卡壳了。诸位都牛烘烘的,我这一点家底也不算什么。就是一个图形处理程序。自己用呗,也懒得重现什么jpeg编解码器,想当然系统有,也就必然有那么个API可以用。翻了半天MSDN傻眼了,开始在CSDN疯狂搜索。最后发现了IPicture,算是和COM的第一次亲密接触吧,不过也是不欢而散,后来用上了GDI+,功能弱点,也没办法,谁叫是在别人的屋檐下呢?(后来知道,GDI+对图片的解码也是用的COM,呜呼哀哉……)
程序是越写越大,渐渐开始觉得SDK力不从心了。MFC是铁了心的不想去了,剩下的选择似乎就是WTL/ATL了。也不知道前景如何。编程群里的老前辈悉心教导:你才大一呢,多学学.Net,将来衣食无忧。是,小弟的确资格不够,不过软件工人还是不想做的。feimingbiao那个“架构师”把小弟给羡慕坏了。不过自己还有点自知之明,知道那不是自己这种愚人的去处。COM过时,COM风光不在。有什么办法呢?好像自己就只好往这条路钻了。刚刚学编程(那时可能才初二吧)看了一篇文章,说凡事信任自己的东西,自己的效率最高。于是被惯坏了,人家MFC开始学Win32,我嗤之以鼻,自己钻WndClass,钻Message Loop,浑然忘了哪朝哪代,人家DOS下的老古董现在还可以奉为圣旨吗?!都什么时候了,哪个项目不是几万行代码,自己一个人搞得定吗?于是几年下来没学会什么,倒是谦虚了很多:自己的?自己又不是上帝,别人的还不是要用?渐渐的开始关注了下新技术。别的不敢说,.Net出来时倒真的是赶了下潮流。不过往年艰苦环境下养成的缺点是改不过来了。看看Java“虚拟机,真慢啊”,MFC“一个实例滚雪球实例化这么多类,又大又慢”,.Net“中间代码?即时编译?免了……”到头来什么都没学深,那些编程哲学什么的是浑然未觉,还是自己复制/粘贴一个又一个WinMain,等着Prefect的东西,出来,殊不知,世界上好像还没有什么是Perfect的。领悟过来准备学了,也快大二了,说实在这么多年自学电脑是白学了,走了无数条弯路最后只好转回来,想想也只好苦笑。
小弟年纪小,还不清楚商场上的那些争端。写些东西也是成不了器。学习啊,努力啊,群里的人天天在嘱咐,不过也不知道可以努力到什么地方去。唯一知道的是Java要学,.Net要学,MFC要学,COM要学,用不用是自己的事,到时候毕业了没人要就真的要挂了……反正现在中国就这个行情。想不赶时髦?钱包同意吗?老婆同意吗?车不敢想,房子总要吧??
今天下了决心。还是潜心钻研COM吧,虽说难,虽说有这样那样的缺点(我一本.Net的书将COM批得一无是处),但是还是比较符合自己的理念。各位大大,有没有一些介绍COM的书看呢?原理方面都懂,但是真正用起来都不会。常常感叹,过去DOS下的幸福日子哪去了……
仔细想想,其实还是有点收获。接触了这么多Framework,那么多Library,大师们的思想在那里。自己稍稍领略一点就受用不尽。想想看自己也就真的没有抱怨的资格了……
不过话说回来,技术在进步,我们都站在巨人的肩膀上。不要老是唠叨身下的巨人怎么怎么不好,你可是被别人托着呢,还是少点怨言吧……
在没有另一个标准能取代它之前,COM不会淡出。呵呵。其实我觉的COM永远不会淡出(再来一个标准也还只能是换个名字而已,那为什么要再来一个标准?)。所以COM只是越来越“由台前到幕后”。
很多年了,感觉并没有推广使用,原因是什么呢/////////////////////////稍微大点的基于WINDOWS的项目,就会有COM的身影
应用的范围并不校
很多年了,感觉并没有推广使用,原因是什么呢/////////////////////////稍微大点的基于WINDOWS的项目,就会有COM的身影
应用的范围并不窄
COM这东西我觉接着刚开始学的时候觉得挺神,等真正了解它了也就是个dll,只不过写了个注册表而已,微软把它发挥到了极致,但是有几个公司真正把它用的和ms一样的我还没有见过,新东西太多,我们也只能跟着ms跑了,一个字“累”。
建议大家去真正理解,只是个技术,看我们怎么去用它了,你可以不写注册表COM同样的用,我也是从那时候走过来的,得有个过程,理解了它对你好处大大的!如果你理解了COM,那么大家试着手工写个com组件来,不用atl和mfc。好久没有来回帖了!
com就一编程规范。编程的时候按此规范写了就成了com组件。
C++的基础上看COM基本上能看得懂,但要讲应用到实际中的确很难.
这种规范有些烦琐,而且到目前为止几乎没发现太大的好处.
并不是说COM一无是处,学习一下里面的精髓还是很有用的。虽然现在技术领域的新东西太多,但是老的技术的精华往往就是新技术的基础。不管是否能够以此作为生活的饭碗,都应该了解技术的轨迹,这样也有助于自己在技术领域的触类旁通。再者,COM既然能够广泛应用,并且形成了相应的技术产业链,其价值已经得到肯定。新技术的目的不是为了推翻旧技术,而是衍伸和发展。利用早期技术和成熟的技术所创造的价值接触和产业基础,才能走得稳。这本身也是一种继承,再继承所以说COM与学习新技术没有任何冲突,也不会让你误入歧途。前人的经验就是路标。现在所要做到的仅仅是抽出一点时间来了解一下,已经成熟成型的技术的养分。仅此而已
http://www.vckbase.com/document/viewdoc/?id=1520
其他地方,原来说com比dll有优点,比如解决了dll黑洞的问题。但是实际中,我自己用的多的还是dll、lib。原因是开发简单。而且这种开发方式也很通用(比如在Unix上也是如此)。
当然com还有优点是,跨语言的特点。VB、VC、Delphi都可以用来开发。虽然《com本质论》里说“com是更好的C++”。
现在来说com用的最多的地方可能就是ActiveX。而类似于DCOM来做客户端、服务器的应用的话,Corba应该是个不错的替代选择。
(我自己学习了一段时间com,现在用corba比较多。水平有限,大家见谅:)
在结束的时候,虽然我觉得讨论的东西不够热烈,但是已经涵盖了我所定义的主题,所以可以暂将这个讨论结束,感谢各位的参与,特别感谢feimingbiao() 分享他的小前半生,文字活泼,内容充实,颇值玩味。
这仅仅是个开始,我们会有更多的讨论,精彩的永远是下一个。