一个关于ATL的问题

G_zcm 2001-11-30 09:56:25
IDL文件如下:
[
object,
uuid(CC26A9DD-7CB5-41F0-9F4D-6BAE25C93FD1),
dual,
helpstring("IFoo Interface"),
pointer_default(unique)
]
interface IFoo : IDispatch
{
};
[
object,
uuid(66842729-E94E-4c99-9796-3CA5AEE90DDF),
dual,
helpstring("IFoo2 Interface"),
pointer_default(unique)
]
interface IFoo2 : IDispatch
{
};
。。。。。。。。。。

coclass MultiInterface
{
[default] interface IFoo;
interface IFoo2;
};
// 类声明如下:
class ATL_NO_VTABLE CMultiInterface :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMultiInterface, &CLSID_MultiInterface>,
public IDispatchImpl<IFoo,&IID_IFoo,&LIBID_MULTIINTERFACEMODLib>,
public IDispatchImpl<IFoo2,&IID_IFoo2,&LIBID_MULTIINTERFACEMODLib>
// 编译时,下面的代码报错
BEGIN_COM_MAP(CMultiInterface)
COM_INTERFACE_ENTRY(IFoo)
COM_INTERFACE_ENTRY(IFoo2)
COM_INTERFACE_ENTRY(IDispatch)/*这句报ambiguous conversions from 'class CMultiInterface *' to 'struct IDispatch *'的错*/
END_COM_MAP()
如果我将:
interface IFoo2 : IDispatch{};
改为:interface IFoo2 : IUnknown{};

public IDispatchImpl<IFoo2,&IID_IFoo2,&LIBID_MULTIINTERFACEMODLib>
改为:
public IFoo2

编译就正常了,请问高手,这是为什么。
如果我想实现两个或多个从IDispatch继承来的接口,该如何处理。

谢谢!

...全文
51 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
北极猩猩 2001-11-30
  • 打赏
  • 举报
回复
当然是不行的,因为CMultiInterface继承了所有的接口,而你对IDispatch的继承不是虚继承,所以在进行转型是无法判断的转型路径究竟是转向哪个IDispatch。
从使用角度来看我是在想不出为什么会需要两个IDispatch接口,因为IDispatch是为COM提供方法派发而设的,Client只需要查询IDispatch来获得方法指针,两个IDispatch又有什么用呢?
G_zcm 2001-11-30
  • 打赏
  • 举报
回复
大家看看吧!

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧