在IDL中将IUnknown派生的接口标记为双重的任何意义?

时间:2009-10-28 09:42:39

标签: windows com com-interop idl midl

查看我们的代码我在其中一个.idl文件中找到了一个好奇的定义:

[
    object,
    uuid(uuidhere),
    dual,
    nonextensible,
    oleautomation,
    hidden
]
interface IOurInterface : IUnknown {
    //methods here
};

如何直接从IUnknown派生的接口可能是双接口?如果删除dual属性,会有什么问题吗?

2 个答案:

答案 0 :(得分:3)

this answer中关于编组user voyce点到this article的另一个问题基本上陈述如下:

当任何接口(IDispatch派生或非派生)被标记为dualoleautomation(或两者)时,在调用RegisterTypeLib()时会对其进行特殊处理(通常由DllRegisterServer完成) )。对于每个这样的接口,创建HKCR \ Interface {InterfaceId}密钥,在该密钥下,{00020424-0000-0000-C0000-000000000046}类被引用为代理/存根。此类ID对应于typelib marshaller,也称为oleautomation marshaller。

答案 1 :(得分:1)

鉴于此处的文档,我看不出有什么可行的原因: http://msdn.microsoft.com/en-us/library/aa366807(VS.85).aspx

  

双重识别的接口   属性必须兼容   自动化和衍生自   IDispatch接口。这个属性不是   在调度接口上允许。

可能是[dual]属性隐式地将IDispatch添加到界面。

如果它来自IDispatchImpl,你可以做的是检查实现接口的代码(假设这是ATL)。如果是这样,它实际上会对IDispatch的QI做出响应,并且可能会这样使用。

另一种方法是实例化实现IOurInterface的对象和IDispatch的QI - 如果成功,则可能无法将其删除。

实际上,想一想,只要您实现自定义界面和[dual]IDispatch技术上并不要求您从IDispatch派生出来?