coclass倒底和接口是什么关系?????
ATL中添加的Simple Object是不是就是接口啊
coclass 是不是就是定义一个接口用
大家现在写COM一般都是用什么写呢?ATL还是VB或别的????
小弟开始看<COM与COM+从入门到精通>一边入门一边迷惑,大家谁看过这本,说说应该怎么看吧????

解决方案 »

  1.   

    coclass是用于编译生成类型库文件用的(.tlb),只能在library块(library{},其中的内容用于生成类型库文件)中。类型库用于让其他应用程序能在运行时识别COM组件的接口信息,而以此操作对应的COM组件。如果你不打算生成类型库,完全不用写coclass,它只是告诉那些以类型库进行类别信息识别的软件(如:VC的IDE中用于生成包装类的部分)和这个类型库绑定的COM组件应该实现了这么一个COM对象类别(即一个声明,它说明如果你用这个COM对象类别的CLSID,通过调用CoCreateInstance而得到了一个IUnknown指针,则可通过IUnknown::QueryInterface来请求在coclass中注明的接口——可以有多个接口)。应当注意,COM对象类别只是协议,即一个类声明或结构声明,不是实体。实体是你具体用ATL或MFC写的代码(也可以不用)。 因此coclass只是为了生成类型库用,完全可以不要(即将你工程中的.idl文件中的library{}删掉)。但如果你用向导生成ATL工程,直接删除后将会出现编译错误。因为你的向导生成的代码中需要LIBID_YourLibraryName和CLSID_YourClassName这两个由MIDL生成的全局变量,之所以需要是因为你的向导在生成的DllServerRegister(可能写错了)中要求注册类型库信息,既将一个类型库文件和一个CLSID(唯一标识一个COM对象类别)绑定。所以如果不要coclass将会使得你不能生成对应的COM对象类别的类型库信息,因此你的对应的COM对象类别的实例不能做所有与类型库相关的技术操作(如:ActiveX技术)。一个Simple Object就是一个你在.idl文件中用coclass指明的一个COM对象类别的一个实现,即你的coclass指明了几个纯虚类(如:IUnknown、自定义的接口),而你的Simple Object就从这些接口派生(多重继承),并实现在父类中定义的虚函数(如IUnknown::AddRef等),因此称之为COM对象类别的实现,即IUnknown的实现。
    注意:MFC编的COM组件和上面不一样,不是通过多重继承来实现多接口的。
      

  2.   

    推荐《COM技术内幕》和《ATL深入解析》
      

  3.   

    我写COM相关软件时基本都是用ATL,只有在需要表现大量界面时才使用MFC来写COM,至于大家我就不知道了
    <COM与COM+从入门到精通>我没看过,不清楚好坏,不过我建议看一本《DCOM入门》,虽然是入门,但我认为比其他的书讲地深入得多。
      

  4.   

    推荐在看《深入解析ATL》的同时去跟踪ATL的代码。一切都将OK。
      

  5.   

    to Microsoftadherent
    如何跟踪ATL的代码????
      

  6.   

    通过右键菜单,选择里面的“跳到声明”或“跳到定义”,如果使用VC6,则“跳到声明”和“跳到定义”对于ATL是一样效果,都只能看到类的声明,不能见到其成员函数的定义,VC7就可以。如果你是vc6,可以通过VC提供的“文件中查找”(编辑菜单中的一个命令)来搞定。
    在查找中输入“::SetCurSel(”,再将位置定位为VS的目录,它将会找出目录下所有出现了“::SetCurSel(”的地方,其中应该就有CListBox::SetCurSel(...的定义,那样就可以看MFC的源码了。
    我之所以说是MFC,是因为ATL是基于模板的,模板类不能在源文件中写定义(即只有.h文件),也就是说其类的声明和定义在一起,都在.h文件中,而不象其他的可以分在.cpp和.h中。你先通过向导生成一个ATL的工程,加入个Simple Object的ATL对象,然后看向导生成的文件,里面的类从哪些类派生,再去看每个类的定义,以此了解ATL是如何实现COM的要求的。不过如果是新手,建议还是不要这么做,这样只会越看越昏,还是找本书慢慢读