在IDL中将IUnknown派生的接口标记为dual有什么意义?

回顾我们的代码,我在.idl文件中find了一个好奇的定义:

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

一个从IUnknown直接派生的接口怎么可能是一个双接口? 如果我删除dual属性,会有什么破?

Solutions Collecting From Web of "在IDL中将IUnknown派生的接口标记为dual有什么意义?"

我看不出有什么理由可以解决这个问题: http : //msdn.microsoft.com/zh-cn/library/aa366807(VS.85).aspx

由双属性标识的接口必须与自动化兼容,并从IDispatch派生。 该属性在调度接口上是不允许的。

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

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

另一种方法是实例化一个对象实现IOurInterface并为IOurInterface QI它 – 如果成功,您可能无法删除它。

其实,想一想,也许[dual]在技​​术上不要求你从IDispatch派生,只要你实现你的自定义接口和IDispatch

在这个关于编组用户voyce的另一个问题的答案指向这篇文章 ,基本上说明如下:

当任何接口(IDispatch派生与否)被标记为dualoleautomation (或两者)时,它被特殊处理,当调用RegisterTypeLib()RegisterTypeLib()通常由DllRegisterserver完成)。 对于每个这样的接口,创建一个HKCR \ Interface {InterfaceId}键,其中{00020424-0000-0000-C0000-000000000046}类被引用为代理/存根。 这个类ID对应于也称为oleautomation编组器的typelib编组器。