回顾我们的代码,我发现一个奇怪的定义中的.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 \接口{InterfaceId}键在其下{00020424-0000-0000-C0000-000000000046}类别作为代理/存根引用。 这个类ID对应的类型库编组也被称为了oleautomation编组。
我看不到一个原因,那会的工作,在这里给出的文档: http://msdn.microsoft.com/en-us/library/aa366807(VS.85).aspx
通过双重属性标识的接口必须与自动化兼容,并从IDispatch接口派生。 此属性是不允许的调度接口。
这可能是因为[dual]
属性隐式添加IDispatch
的接口。
你可以做的是检查实现接口的代码(假设这是ATL),如果它派生自IDispatchImpl
。 如果是的话,它实际上响应齐作IDispatch
和可能被用作这样的。
另一种方法是实例实施对象IOurInterface
和QI它IDispatch
-如果成功,你可能无法将其删除。
其实,细想一下,也许[dual]
在技术上不要求你派生自IDispatch
,只要你同时实现您的自定义接口和IDispatch
?