2

在 ac# com 接口中,可以像这样定义一个默认成员

[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IMyComClass
{
    [DispId(0)] string Item{get;}
}

使用 IDispatch(或双重)一切都按预期工作,从 VBA 我可以省略这样的属性

Dim o1 As New MyComClass
Debug.Print o1 'this is equivalent to o1.Item

但是如果我只将接口定义为 IUnknown,它就不起作用。在 excel 对象浏览器中,我仍然看到标有“蓝点”并标记为“默认成员”的属性。但是 .Item 必须在 VBA 代码中明确指定。

有没有办法让 IUnknown 中的默认属性表现得像 IDispatch 中一样?

4

1 回答 1

4

不,默认属性是一个只能应用于 IDispatch 派生接口的概念。您在 Debug.Print 语句中使用的后期绑定不能在 IUnknown 接口上工作,实现该接口的 coclass 没有调用由数字选择的函数所需的机制。

查看IDispatch::Invoke() 方法,这是完成工作的方法。使用默认成员只需为第一个参数传递 0 即可。

消除您在对象浏览器中看到的怪癖,它完全假定 COM 对象支持自动化。

于 2014-11-19T11:42:42.927 回答