大家都知道我们的组件都是继承IUnknown,
  那么,addref是不是也是我们的组件实现?? 
  如何实现一个组件继承另外一个组件。  例如:
  idl中:
  interface IA : IDispatch
   ...
  interface IB : IA
    ...   
   
这个如何实现。   大家去看看ado 类型库中微软的做法:
  interface _ADO : IDispatch {//定义公用接口
        [id(0x000001f4), propget, helpcontext(0x0012c900)]
        HRESULT Properties([out, retval] Properties** ppvObject);
    };   interface Command15 : _ADO 
   interface Connection15 : _ADO 
 哪位指点1 2。
 分不够可以再加!!  时间紧任务急!!!
    

解决方案 »

  1.   

    >> addref是不是也是我们的组件实现??是,你的组件还用实现 Release(), QueryInterface()>> 如何实现一个组件继承另外一个组件。一般我们说,一个组件实现了某个接口>> 这个如何实现。你只需把你需要实现的接口的方法全部实现就可以了。
    比如你要实现 interface _ADO,那么在你的类里要实现
    _ADO的所有method和property.
      

  2.   

    我曾经看过一个例子,时间很久了,具体什么内容忘记了,大概是这样的:在项目Base里实现接口IVehicle,实现一些空的函数定义,在项目Car里#import "base.tlb" ...(后面带参数,略),实现ICar,把在IVehicle里定义的函数重载,大概情况就是这样的,能够实现接口继承,但具体有什么实际意义,我还没想清楚。后来,我自己写程序的时候,发现几个问题,还望高手继续指点:1.IVehicle的函数怎么做成纯虚函数?
    2.IVehicle和ICar能否做到一个项目里?
      

  3.   

    >> 1.IVehicle的函数怎么做成纯虚函数?virtual HRESULT Drive() = 0;>> 2.IVehicle和ICar能否做到一个项目里?当然可以了,这才是C++和COM的优势class ICar : public IVehicle
    {
    public:
       HRESULT Drive();
    };
      

  4.   

    to  brave_heart(白菜):
    是的,经你提醒,看书的时候的确是曾经看过这么一节内容,不过我很菜,用的是ATL,所以还是有几个问题问你:>> 1.IVehicle的函数怎么做成纯虚函数?virtual HRESULT Drive() = 0;class ICar : public IVehicle
    {
    public:
       HRESULT Drive();
    };如果用ATL的话,这些语句加到那个文件里,是IDL么?还是单独自己做一个文件?有没有省劲点的方法?
      

  5.   

    这个问题很难,琢磨两天了,实现接口继承很容易,可是如果用ATL向导的话,真的是没找到方法,那位高手指点一下
      

  6.   

    2  brave_heart(白菜)   接口继承具体如何做??
      我直接用一个接口继承另外一个
     
       然后再相应的组件实现class中手工添加函数   但是,编译就有问题。
      

  7.   

    2  xlander(阿富)    我找个一个例子了
       不过还没有搞定。http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnguion/html/msdn_093098.asp
      

  8.   

    >> 这个问题很难,琢磨两天了,实现接口继承很容易,可是如果用ATL向导的话,真的是没>> 找到方法,那位高手指点一下ATL向导只是帮你生成一个骨架,具体的代码还是要你自己手工添加的。给你一个网站,里面好多sample code.Beginner's Tutorial: COM/ATL Simple Project
    http://www.codeproject.com/atl/com_atl.asphttp://www.codeproject.com/atl/
      

  9.   

    http://groups.google.com/groups?hl=zh-CN&lr=&ie=UTF-8&oe=UTF-8&threadm=euPrHejECHA.2516%40tkmsftngp02&rnum=11&prev=/groups%3Fq%3Dinterface%2Binherit%2Batl%26start%3D10%26hl%3Dzh-CN%26lr%3D%26ie%3DUTF-8%26oe%3DUTF-8%26selm%3DeuPrHejECHA.2516%2540tkmsftngp02%26rnum%3D11终于有答案了看来自己对代码要全部读懂才好。
      

  10.   

    谢谢各位,大家可以到
    http://expert.csdn.net/Expert/topic/1901/1901677.xml?temp=.6865503
    拿分,可以不回答问题,要不哪一百分就浪费了,哈哈
      

  11.   

    操作要点:
    1)idl中IDrived直接IBase;
        Interface:IDrived:IBase
    2)  父子的方法中id不能重复3)  组件的头文件中
        使用COM_INTERFACE_ENTRY2(IBase,IDrived)    把对于父接口的map2到子接口中4) 手工添加(组件类的.h .cpp文件中)
        父接口的声明和实现认识和思考:
      为什么要map2? 
      原因:多重继承的结果我们的组件中有多个父接口的vtable(完全相同)
             我们必须使用哪一个,哪个都可以--因为完全相同  什么时候map2?
      只要出现了多重继承,就使用:map:IBase-->IDerived OK总结完毕请来点掌声!!!
             
      

  12.   

    有点问题:
    vc客户端调用说“不支持这个接口”// TTT.h : Declaration of the CTTT#ifndef __TTT_H_
    #define __TTT_H_#include "resource.h"       // main symbols/////////////////////////////////////////////////////////////////////////////
    // CTTT
    class ATL_NO_VTABLE CTTT : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CTTT, &CLSID_TTT>,
    public IDispatchImpl<ITTT, &IID_ITTT, &LIBID_INHERITTESTLib>//,
    //public IDispatchImpl<ITTT0, &IID_ITTT0, &LIBID_INHERITTESTLib>
    //public ITTT1
    {
    public:
    CTTT()
    {
    }DECLARE_REGISTRY_RESOURCEID(IDR_TTT)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CTTT)
    COM_INTERFACE_ENTRY2(IDispatch,ITTT0)//COM_INTERFACE_ENTRY2IDispatch,ITTT)也可以
    COM_INTERFACE_ENTRY2(ITTT0,ITT)
    COM_INTERFACE_ENTRY(ITTT)//<<-----加上这行就可以了
    END_COM_MAP()// ITTT
    public:
    STDMETHOD(test1)();
    STDMETHOD(test0)();
    STDMETHOD(get_www2)(/*[out, retval]*/ long *pVal);
    STDMETHOD(put_www2)(/*[in]*/ long newVal);
    STDMETHOD(get_wwww1)(/*[out, retval]*/ long *pVal);
    STDMETHOD(bbbb)();
    STDMETHOD(aaaa)();
    STDMETHOD(get_SSS)(/*[out, retval]*/ long *pVal);
    STDMETHOD(put_SSS)(/*[in]*/ long newVal);// ITTT0
    private:
    long m_nWww2;
    long m_nSSS;};#endif //__TTT_H_说明:
    接口关系
    ITTT:ITTT0