我现在在写一个dll(son.dll),该dll要继承另外一个dll(father.dll)里的一个接口(例如:IMyInterface)该接口将在son.dll中被实现。我的写法是这样的:
//son.h
#include "father.h"
#include "father_i.c"class ATL_NO_VTABLE CSon : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSon, &CLSID_Son>,
public ISupportErrorInfo,
public IDispatchImpl<ISon, &IID_ISon, &LIBID_SonLib>,
public IMyInterface
{
......BEGIN_COM_MAP(CMLTest)
COM_INTERFACE_ENTRY(IMLTest)
COM_INTERFACE_ENTRY_IID(IID_IDispatch,IMLTest)  
COM_INTERFACE_ENTRY(ISupportErrorInfo)
          COM_INTERFACE_ENTRY(IMyInterface)
END_COM_MAP()
......
}//son.idl
import "oaidl.idl";
import "ocidl.idl";
import "son.idl";
[
object,
uuid(CCE47DEC-B40C-4831-B5EE-5C404A9A8F36),
dual,
helpstring("ISon Interface"),
pointer_default(unique)
]
interface ISon : IDispatch
{
};......
coclass Son
{
[default] interface ISon;
interface IMyInterface ;
};
};我想这样就应该对了,但是总是编译不过。不知道是father组件需要支持一些什么还是我的son组件继承的写法不对。
另:father组件也是用atl模板生成的(simple object)com组件,但是IMyInterface在该组件中没有实现只是做了声明。

解决方案 »

  1.   

    //son.idl
    import "oaidl.idl";
    import "ocidl.idl";
    import "son.idl"; // 是不是 father.idl?
      

  2.   

    哦,我的笔误,应该是“father.idl” , 问题不在这里 ,编译器显示的错误:
    error C2259: 'CComObject<class CMLTest>' : cannot instantiate abstract class due to following members:  d:\program files\microsoft visual studio\vc98\atl\include\atlcom.h(1823) : while compiling class-template member function 'long __stdcall ATL::CComCreator<class ATL::CComObject<class CMLTest> >::CreateInstance(void *,const struct _GUID &,voi
    d ** )'
      

  3.   

    换一个办法吧:
    先生成father.dll,然后在classview中右击CSon,选择Implement Interface,然后再点击"Add TypeLib",选中father.dll就可以了
      

  4.   

    这种情况下,一般要么用聚合,要么用包容。看你的情况用的是包容,你应该在CSon中完成IFather接口的成员,在其中把调用转发给father。
      

  5.   

    RickeyLau(RickeyLau) 的正解,想不到这么简单,多谢各位了!
      

  6.   

    RickeyLau(RickeyLau) 的正解,想不到这么简单,多谢各位了!