Windows 在IDL中将IUnknown派生接口标记为dual有什么意义?
回顾我们的代码,我在一个.idl文件中发现了一个奇怪的定义: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属性,会不会有任何问题?鉴于这里的文档,我看不出有什么原因可
[
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的响应。