我初学COM 是用MFC开发,最近想学习ATL,有如下困惑:
  学习ATL或者COM需要什么基础吗?
  可以推荐一两本关于ATL和COM地好书吗?
 ATL 和COM 什么关系阿?
  我现在在看潘的COM 原理和应用。

解决方案 »

  1.   

    COM是一种规范,ATL是基于COM的应用,
      你最好不要看潘的《COM 原理和应用》,
      推荐的好书有《COM 技术内幕》、《深入解析 ATL》和《用VC++6 创建ActiveX 活动模板库》,前者详细讲述了COM的机制,是一本经典的COm的书籍。
      中者讲述了ATL的内部机制和常用方法的原理,后者讲授了一些应用方法。
      

  2.   

    我看了《COM技术内幕》
    Now 看《COM-COM+》一头污水!
      

  3.   

    COM加MTS就是COM+了COM+不是COM的改进,是一种应用的标准。
      

  4.   

    <ATL 开发指南>
    电子工业出版社
      

  5.   

    我个人认为如果你已经看了<<com原理与应用>>就没有必要看<<Inside Com>>,
    他只是一个入门级别的com书,还是看<<Essential Com>>,这个相当不错的。
    讲的东西很多,很有味道!
      

  6.   

    《COM+基本服务》微软出版。英文原版
      

  7.   

    《COM原理与应用》第4章第1节前讲得很详细,之后的讲得很深入,并不是看一两次就明的。对 COM 有一定了解之后,你才会明白后面那些部分的重要性,几乎是国内唯一一本讲得有如此深入的。建议你多看几次后面的内容。《COM本质论》不用 MFC 或 ATL 来讲解,示例用纯 SDK 打造。而且对COM的作用分析得很详细(我个人认为,详细过了头了,会认第一次看的人不知那些部分才是重要的)。但如果你的COM不是很精通的话。第5章之后可能会很难明
    。《COM本质论》提倡把时间花在 接口、对象、套间。而不要管那些与 OLE 有关的内容。《深入解析ATL》,目前国内能找到的令人满意的唯一一本ATL书,如果要学ATL则建议看这本。但~~~~~~书是很好,可惜 ATL 似乎不那么好,而且有被WTL 取代的“可能”。不过懂 MFC 与 ATL,学WTL应该不难(我没学过,只是估)
    至于 ATL 与 COM 的关系:那就是 ATL 专用于开发 COM 的,用 ATL 开发的 COM 比 MFC 开发的体积要小些(相同功能),而且 ATL 支持双接口,MFC不支持。
      

  8.   

    ATL开发接近SDK开发,只是不能用MFC现成的类,生成的代码小。
      

  9.   

    《Com原理与应用》在讲Com的原理上不如《COm本质论》讲得那么透彻
    建议在看原理部份时重点看《Com本质论》并结合《Com原理与应用》,在理解了Com原理后再看应用部份,否则先看应用只会让你更加迷忙,
    ATL与MFC都有一套基本代码和方法来支持Com对象的注册,创建,生命周期管理,
    接口查询以及其它的Com应用的支持,比如源对象,自动化等等,我想一边理解Com原理一边看Atl及MFC的支持Com的基本代码,对理解Com和应用Atl、MFC都是
    有好处的
    欢迎来信交流Com和VC++,[email protected]
      

  10.   

    ATL使用继承,MFC使用聚合,这是实现COM接口的两种天差地别的方法,不过我个人认为*TL是程序员耍杂技的舞台,对于企业开发MFC要高效、使用的多。如果你有开发大型软件的雄心壮志,我绝对拥护*TL。------
    *TL,让世界更美好!
      

  11.   

    thank u!
      thank u!
     and 
        up
      up!
      

  12.   

      有谁知道COM多线程部分的套间是怎样保证同步的??  在一个线程B中调用另一个线程A创建的组件的接口方法。
      这个接口指针变量是全局的,如果线程B没有用CoIni..()函数初始化,这种调用COM不负责同步。相反COM负责同步。  请问在线程B的调用时,COM是怎样获得这一调用,来实现同步???
      
      下面的一些注册表中值能说明什么问题???
        在注册表的HKEY_CLASSES_ROOT->INTERFACE->{GUID}->ProxyStubClsid32r 值是:{00020424-0000-0000-C000-000000000046}
      在HKEY_CLASSES_ROOT->CLSID->{00020424-0000-0000-C000-000000000046}的值是oleaut32.dll.
      
      如果你的组件在进程外的服务器中,   在注册表的HKEY_CLASSES_ROOT->INTERFACE->{GUID}->ProxyStubClsid32r 值则是你的代理存根dll的CLSID.
      
        
      
      

  13.   

    三本书,刚刚借来《com本质论》(译)《com原理与应用》《ATLxxx》(译)看潘爱民的没错:)
      

  14.   

    首先不太清楚你说的同步指何物,
    我在DirectShow编程时,多线程套间一般是通过临界区来实现同步的:
    coclass C {
      CCritSec m_cLock; 
    }; C::Method() {
      CAutoLock(&m_cLock); 
      ...
    }
    这样线程A,B在同时调用pC->Method时会被串行化。你所说的线程B调用线程A对象的接口方法,既然是明确的调用,那应该是Block模式的(模态调用),线程之间共享地址空间应该没有什么问题;如果是Non-Block模式的,那么线程A和线程B的同步逻辑肯定要自己设计的。比如用Event或Semaphore等;Proxy/Stub好像只提供Marshal,你说的COM提供的同步我不太清楚,好像没有提供吧?欢迎切磋:83592583,秘密信号'tech talk'.
      

  15.   


      上面的老兄:
        你好!
        如果线程A中对象没有实现同步机制,线程B调用线程A对象的接口方法时就会出现问题。如果在将线程B登陆入套间中,即用::CoInitialize()函数加入线程B中,此时将由COM接管同步,所有的COM多线程书中都是如此说的,而且实际程序中也是这样。
      在你的DirectShow程序中,你也不是在对象中用了临界区同步机制。
      如果不用同步机制,且不将另一个访问对象的线程加入套间中就会出现问题是吧!   我写了一个如我上面的组件,如果不在线程序B加入::CoInitialize()函数或::CoInitializeEx(0,COINIT_MULTITHREADED)函数,线程B就不能正确获得结果。
      

  16.   

    关于thread同步是COM Service通过TLS以及message-only Window(Win2k)来实现的。
      

  17.   

    事例的书:《COM精彩编程实例》
      

  18.   

    事例的书:《COM精彩编程实例》
    不知道网上有没有电子书可以下载?