虽然我看了一些关于COM的书,但我还是对OLE、ActiveX、COM三者之间的区分不太清楚。从书上看,ActiveX是微软的产品命名,OLE是一种技术实现,而COM是一种标准。前两者都是构建在COM的规范上,OLE以前不是用COM来实现的,但现在已经改用COM来实现。不知我的理解对不对?
看完《COM原理及其应用》,我对为什么用ATL而不是MFC来实现一个COM控件了解一二。但有点不明白,用ATL Wizard很容易就创建一个COM控件,那么《COM本质论》和《深入解析ATL》两本这么厚的书还有必要读吗?我以前也读了两本关于COM原理的书,但除了对概念有点理解外,于编程好像没有什么太大的帮助。谁有好的意见请给我讲讲。谢谢!

解决方案 »

  1.   

    《COM本质论》和《深入解析ATL》是很好的两本书,建议好好读一下。使用ATL Wizard只能生成最简单的COM对象,没有太多的实用价值,从我做过的项目来看,80%以上的COM对象不能用Wizard直接生成(除非你不是面向对象的)。COM实际上是一个底层协议。而OLE是建立在COM上的高层协议。ActiveX就是OLE的新名字(用于区别于老的OLE1)。如果拿网络协议来做比较,COM相当于TCP/IP,而OLE就相当于HTTP。
      

  2.   

    如果你对COM原理理解不清的话,就不可能设计出良好的“接口”。
    正如你对面向对像设计理解不够的话,一旦设计大一点的项目,你做出的类往往会是一堆"类垃圾"。
    同时,在调试的时候也会少很多的茫然。
    基础知识,什么时候都是很重要的。
    但仅有基础知识,也是什么都做不成的。
      

  3.   

    那么目前通常用COM做一些什么方面的内容?我曾经用ActiveX Wizard写了一个Tsapi的通信控件,已经在一个50多座席的分布式指挥中心使用。但我用ActiveX写的控件太大,300多K,所以才想用ATL来写。而我也读了一些这方面的书(关于COM和ATL)。能不能给我多讲讲?
      

  4.   

    COM只是一种基于接口继承的编程规范,理论上来说,它什么都可以做。
    主要适用的范围还是在可以(并且应该)使用面向接口编程的程序模型里。
    如果你的程序能比较好的利用面向接口模型,那么就应该考虑使用COM。
      

  5.   

    "使用ATL Wizard只能生成最简单的COM对象,没有太多的实用价值,从我做过的项目来看,80%以上的COM对象不能用Wizard直接生成(除非你不是面向对象的)。"
    长见识!请问 nelsonc():那你怎么实现的呢?
      

  6.   

    是呀!我也想知道如果不用ATL Wizard怎样完成那么规范语句的编写?有向导虽然会产生一些不太实用的代码,但毕竟省了很多事情。能不能具体讲讲你写的组件用在什么地方?当然,如果不好讲的话,可以理解。
      

  7.   

    可能我说的不是很明确。
    project当然用wizard生成。但是里面的COM对象就不一定了。
    因为很多COM对象并不要求在系统中注册,不需要ClassFactory,或者多个对象共享通一个接口,甚至有的时候需要产生局部的COM对象(就像局部变量一样)。这时,就要自己写代码了。
    用VC中的“建立ATL”对象,只能产生最规范的那种。
    我推荐大家读一下《深入解析ATL》这本书。里面详细剖析了ATL的结构。只要理解了这些结构,就可以编写自己的类了,从而摆脱VC Wizard的束缚。
    我甚至曾经在普通的Win32 Console程序中建立COM对象,这些都是用Wizard无法实现的。
      

  8.   

    我已经开始使用VC.net来写C++程序,从资料中可以看到使用C#的话能够解决组件注册和类型方面的问题,加上.net Framework完全能够抛开COM,并且.net Framework也提供了与原先的COM的无缝联接,这样的话还需要花很多的时间来学习COM原理和ATL吗,当前的.net Framework技术的发展会不会让学习COM有点晚了?