用ATL编写SHELL扩展时,要从好几个接口分别继承,例如
class CExtractIcon::public IExtractIcon    
class CShellFolder::public IShellFolder
class CShellView::public IShellView等等在这些类和接口中,我只需要暴露IShellFolder组件。而其他的很多接口又几乎都有"虚接口"(不知道是不是这么说的),所以一定要派生一个类来实现。结果我在生成这些类时,如果用“New ATl Object”向导添加的话,向导为每一个组件都暴露接口,什么接口映射,注册文件等等我都得手动去删掉。如果手工生成类,又必须要自己去写AddRef,QueryInterface,Release那些东西。我第一次用ATL,各位大侠,有没有好一点的办法?

解决方案 »

  1.   

    你不要把接口用COM_INTERFACE_ENTRY暴露出来
    别人就QUERY不到了
      

  2.   

    是这样,我要创建一个COM对象,这个COM对象是被系统(Explorer.exe)调用的。在这个对象里面,我需要使用另外一些系统提供的接口,例如IShellFolder,IShellView,IExtractIcon等等,但这些接口里面有很多方法是虚方法,需要自己实现,例如IExtractIcon的Extract方法等。我看到的例子很多都是用纯C++来做的,就是生成一个包装类,例如CExtractIcon:public IExtractIcon这样,然后在CExtractIcon里面实现Extract方法。除此之外,还实现了IUnKnown的方法QueryInterface,AddRef,Release。现在我想用ATL来做,我应该怎么做?我的问题是,用ATL的时候,"New ATL Object"作为最终实现的对象,但怎样包装需要使用到的系统虚接口?具体的说,就是我怎样用ATL来做一个CExtractIcon来包装IExtractIcon?如果也用“New ATL Object",结果在工程里面就包含了很多看上去似乎不必要的东西。如果用New Class,那么还要不要实现IUNKnown的方法?如果要,那还需不需要维护DLL的引用计数?(我看SDK的例子里都是手动维护的,而ATL做的COM就不需要手动)拜托各位大侠说得尽量清楚一点,我初次用COM做项目,惨啊。
      

  3.   

    这样的情况,究竟是用ATL好还是用SDK好?我看SDK的例子,总共就一个CLSID,清爽得多。如果用ATL,需要用到一个虚接口,就New 一个ATL Object,不是要出一大堆CLSID,注册一堆对象到客户机?不过用SDK,要多敲好多东西,而且还容易搞错。
      

  4.   

    atl好!如果你基础好的话你就用sdk比较好!
    用New Class,不用实现IUNKnown的方法!
      

  5.   

    非常感谢。不过是否可以解释一下为什么可以不用实现IUnKnown的方法?
      

  6.   

    用SDK写算了。至少看起来要清楚些。