在标志着IDL一个IUnknown派生接口双任何意义?(Any sense in marking a

2019-09-01 21:39发布

回顾我们的代码,我发现一个奇怪的定义中的.idl文件中的一个:

[
    object,
    uuid(uuidhere),
    dual,
    nonextensible,
    oleautomation,
    hidden
]
interface IOurInterface : IUnknown {
    //methods here
};

如何直接来源于一个接口IUnknown可能是双接口? 请问什么突破,如果我删除dual属性?

Answer 1:

在这个回答关于编组另一个问题用户voyce指向这篇文章基本上规定如下:

当任何接口(IDispatch的衍生的或不)被标记或者dualoleautomation (或两者)是经过特殊处理的时RegisterTypeLib()被调用(这通常是通过的DllRegisterServer完成)。 对于每个这样的接口创建一个HKCR \接口{InterfaceId}键在其下{00020424-0000-0000-C0000-000000000046}类别作为代理/存根引用。 这个类ID对应的类型库编组也被称为了oleautomation编组。



Answer 2:

我看不到一个原因,那会的工作,在这里给出的文档: http://msdn.microsoft.com/en-us/library/aa366807(VS.85).aspx

通过双重属性标识的接口必须与自动化兼容,并从IDispatch接口派生。 此属性是不允许的调度接口。

这可能是因为[dual]属性隐式添加IDispatch的接口。

你可以做的是检查实现接口的代码(假设这是ATL),如果它派生自IDispatchImpl 。 如果是的话,它实际上响应齐作IDispatch和可能被用作这样的。

另一种方法是实例实施对象IOurInterface和QI它IDispatch -如果成功,你可能无法将其删除。

其实,细想一下,也许[dual]在技术上不要求你派生自IDispatch ,只要你同时实现您的自定义接口和IDispatch



文章来源: Any sense in marking an IUnknown-derived interface as dual in IDL?