5

查看我们的代码,我在 .idl 文件之一中发现了一个奇怪的定义:

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

直接派生的IUnknown接口怎么可能是双接口?如果我删除该dual属性,会有什么问题吗?

4

2 回答 2

3

这个关于编组用户 voyce的另一个问题的答案中,这篇文章基本上说明了以下内容:

当任何接口(IDispatch 派生或不派生)被标记为一个dualoleautomation(或两者)时,它在被调用时被特殊处理RegisterTypeLib()(这通常由 DllRegisterServer 完成)。对于每个这样的接口,都会创建一个 HKCR\Interface{InterfaceId} 键,在该键下 {00020424-0000-0000-C0000-000000000046} 类被引用为代理/存根。此类 id 对应于 typelib marshaller,也称为 oleautomation marshaller。

于 2009-11-16T12:43:30.773 回答
1

鉴于此处的文档,我看不出这样做的原因: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?

于 2009-11-02T06:11:28.620 回答