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

Windows 在IDL中将IUnknown派生接口标记为dual有什么意义?,windows,com,com-interop,idl,midl,Windows,Com,Com Interop,Idl,Midl,回顾我们的代码,我在一个.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
属性,会不会有任何问题?

鉴于这里的文档,我看不出有什么原因可以解决这个问题:

由双重属性标识的接口 属性必须与兼容 自动化和可派生自 伊迪斯帕奇。此属性不可用 在DispInterface上允许

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

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

另一种方法是实例化一个实现
IOurInterface
的对象,并为
IDispatch
初始化它——如果成功,您可能无法删除它

实际上,仔细想想,也许
[dual]
在技术上并不要求您从
IDispatch
派生,只要您同时实现了自定义接口和
IDispatch

到另一个关于封送点的问题,基本上陈述如下:


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

啊,是的,没错。既然你已经有了自动化,我想这是隐含的。。。不过,我不知道具体细节,所以感谢您的跟进!我仍然认为,在移除对象之前,您应该确保对象当前没有对
IDispatch
的QI做出响应。是的,我完全同意QI对IDispatch的响应。