继承接口 & IUnknown , IDispatch 方法定义

Posted

技术标签:

【中文标题】继承接口 & IUnknown , IDispatch 方法定义【英文标题】:inheriting interface & IUnknown ,IDispatch methods definitions 【发布时间】:2012-05-26 06:46:10 【问题描述】:

我需要继承一个带有抽象方法的接口, 在 VB/c# 中,我们只需覆盖接口中的方法,而无需为 IUnknown 或 IDispatch 方法编写代码

但在 C++ 中, 在类中继承接口并在接口中覆盖方法之后, 当我试图实例化派生类时 我收到以下错误

error C2259: 'Imyinterface' : cannot instantiate abstract class
1>          due to following members:



'HRESULT IUnknown::QueryInterface(const IID &,void **)' : is abstract
'ULONG IUnknown::AddRef(void)' : is abstract
 'ULONG IUnknown::Release(void)' : is abstract 

所以我需要覆盖/定义 IUnknown 和 IDispatch 方法,例如addref,Release,QueryInterface,invoke,gettypeinfo

因为它们似乎是标准函数,我在哪里可以获得它们的代码/定义,例如 ATL 或任何类型库? 或任何我可以获得上述方法的代码/示例的参考资料

【问题讨论】:

我添加了 COM 标记,因为这个问题似乎与 COM 密切相关。 msdn.microsoft.com/en-us/library/c43h4867.aspx 【参考方案1】:

QueryInterface:如果传入的GUID标识的接口可以到达,则在void **参数中放一个指向该接口的指针;否则将void ** 设置为NULL。返回相应的HRESULT

AddRef:增加接口的引用计数。

Release:减少接口的引用计数。

我建议在深入研究之前获得一本关于 COM 的好书。 Inside Com (Microsoft Programming Series) by Dale Rogerson 的二手副本很便宜。它确实有例子。阅读亚马逊上的评论,了解您是否愿意购买这本书。

【讨论】:

谢谢你,参考书,有代码或例子吗?因为我看过几本解释机制的书,但没有可靠的代码/例子。【参考方案2】:

您需要覆盖这些方法并提供它们的定义(在您的派生类中)以及在您的基类中声明为纯虚拟的所有函数。 除非您这样做,否则您的派生类也充当抽象类,您不能创建它的任何对象。

对于第二个问题,不,我不知道这些方法的标准实现应该做什么。

【讨论】:

谢谢你,你知道我在哪里可以找到他们的定义/任何例子吗?

以上是关于继承接口 & IUnknown , IDispatch 方法定义的主要内容,如果未能解决你的问题,请参考以下文章

DirectX11--ComPtr智能指针

IUnknown 指针引用

为啥通过同一个 COM 对象的不同接口检索到的 IUnknown* 指针具有相同的值?

分布式系统架构-samgr/source系统服务开发框架基础代码iunknown.c讲解

为啥我的 IUnknown 释放函数会阻塞我的子线程?

COM 中的数据类型