我用ATL向导生成COM,插入了两个ATL Object,分别为A,B。我希望B对象,继承接口A,并实现。于是,我修改了B的继承关系,如下所示(*修改后的继承关系*)
可总是有这样的错误提示:
//错误提示
d:\temporary folder\exam2\b.h(28) : error C2594: 'static_cast' : ambiguous conversions from 'class CB *' to 'struct IDispatch *'
//错误提示
请问:
为什么会出现这样的错误?如果这样继承不对,该如何继承呢???
//*修改后的继承关系*
class ATL_NO_VTABLE CB : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CB, &CLSID_B>,
public IDispatchImpl<IB, &IID_IB, &LIBID_EXAM2Lib>,
public IA   //手动添加部分
{
public:
CB()
{
}DECLARE_REGISTRY_RESOURCEID(IDR_B)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CB)
COM_INTERFACE_ENTRY(IB)
COM_INTERFACE_ENTRY(IA)//手动添加部分
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()// IB
public:
};#endif //__B_H_

解决方案 »

  1.   

    B.idl 要继承A.idl 而A.idl继承idispatch或iunkown
      

  2.   

    把这里改一下
    BEGIN_COM_MAP(CB)
    //COM_INTERFACE_ENTRY(IB)  //手动屏蔽掉
             COM_INTERFACE_ENTRY2(IDispatch,IB)//手动
    COM_INTERFACE_ENTRY(IA)//手动添加部分
    END_COM_MAP()
    给你个例子:
    idl:
    import "oaidl.idl";
    import "ocidl.idl"; [
    object,
    uuid(DD70A5F5-A411-459a-B54C-05F8CF56E791),
    dual,
    helpstring("IRTI1 Interface"),
    pointer_default(unique)
    ]
    interface IRTI1 : IDispatch //手动
    {
    };
    [
    object,
    uuid(3F7E1AE7-FDC2-41D6-8AC6-F24BECCA3F44),
    dual,
    helpstring("IRTI Interface"),
    pointer_default(unique)
    ]
    interface IRTI : IDispatch
    {
    };[
    uuid(5F090D9A-8E8A-4EA7-AA92-2D7E03238146),
    version(1.0),
    helpstring("MuitInterface 1.0 Type Library")
    ]
    library MUITINTERFACELib
    {
    importlib("stdole32.tlb");
    importlib("stdole2.tlb"); [
    uuid(D096EC0F-CBB6-4286-B453-695B6E0FBD41),
    helpstring("RTI Class")
    ]
    coclass RTI
    {
    [default] interface IRTI;
    interface IRTI1;  //手动
    };
    };.h:
    // RTI.h : Declaration of the CRTI#ifndef __RTI_H_
    #define __RTI_H_#include "resource.h"       // main symbols/////////////////////////////////////////////////////////////////////////////
    // CRTI
    class ATL_NO_VTABLE CRTI : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CRTI, &CLSID_RTI>,
    public IDispatchImpl<IRTI, &IID_IRTI, &LIBID_MUITINTERFACELib>,
    public IDispatchImpl<IRTI1, &IID_IRTI1, &LIBID_MUITINTERFACELib>//手动
    {
    public:
    CRTI()
    {
    }DECLARE_REGISTRY_RESOURCEID(IDR_RTI)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CRTI)
    //COM_INTERFACE_ENTRY(IRTI)   //手动
    COM_INTERFACE_ENTRY2(IDispatch,IRTI)  //手动
    COM_INTERFACE_ENTRY(IRTI1)   //手动
    END_COM_MAP()// IRTI
    public:
    };#endif //__RTI_H_
    没问题的!哈哈
      

  3.   

    修改COM_INTERFACE_ENTRY(IDispatch)为COM_INTERFACE_ENTRY2(IDispatch, IA)