查看我们的代码我在其中一个.idl文件中找到了一个好奇的定义:
[
object,
uuid(uuidhere),
dual,
nonextensible,
oleautomation,
hidden
]
interface IOurInterface : IUnknown {
//methods here
};
如何直接从IUnknown
派生的接口可能是双接口?如果删除dual
属性,会有什么问题吗?
答案 0 :(得分:3)
在this answer中关于编组user voyce点到this article的另一个问题基本上陈述如下:
当任何接口(IDispatch派生或非派生)被标记为dual
或oleautomation
(或两者)时,在调用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
派生出来?