查看我们的代码,我在 .idl 文件之一中发现了一个奇怪的定义:
[
object,
uuid(uuidhere),
dual,
nonextensible,
oleautomation,
hidden
]
interface IOurInterface : IUnknown {
//methods here
};
直接派生的IUnknown
接口怎么可能是双接口?如果我删除该dual
属性,会有什么问题吗?
查看我们的代码,我在 .idl 文件之一中发现了一个奇怪的定义:
[
object,
uuid(uuidhere),
dual,
nonextensible,
oleautomation,
hidden
]
interface IOurInterface : IUnknown {
//methods here
};
直接派生的IUnknown
接口怎么可能是双接口?如果我删除该dual
属性,会有什么问题吗?
在这个关于编组用户 voyce的另一个问题的答案中,这篇文章基本上说明了以下内容:
当任何接口(IDispatch 派生或不派生)被标记为一个dual
或oleautomation
(或两者)时,它在被调用时被特殊处理RegisterTypeLib()
(这通常由 DllRegisterServer 完成)。对于每个这样的接口,都会创建一个 HKCR\Interface{InterfaceId} 键,在该键下 {00020424-0000-0000-C0000-000000000046} 类被引用为代理/存根。此类 id 对应于 typelib marshaller,也称为 oleautomation marshaller。
鉴于此处的文档,我看不出这样做的原因:http: //msdn.microsoft.com/en-us/library/aa366807 (VS.85).aspx
由 dual 属性标识的接口必须与 Automation 兼容并且派生自 IDispatch。调度接口上不允许使用此属性。
可能是该[dual]
属性隐式添加IDispatch
到接口。
您可以做的是检查实现接口的代码(假设这是 ATL),如果它源自IDispatchImpl
. 如果是这样,它实际上会响应 QIIDispatch
并且可能会被这样使用。
另一种选择是实例化一个实现对象IOurInterface
并对其进行 QI IDispatch
- 如果它成功,您可能无法删除它。
实际上,想想看,[dual]
只要IDispatch
您实现自定义接口和IDispatch
?