在c#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一样?
答案 0 :(得分:4)
不,默认属性是一个只能应用于IDispatch派生接口的概念。您在Debug.Print语句中使用的后期绑定无法在IUnknown接口上运行,实现该接口的coclass没有调用由数字选择的函数所需的机制。
查看IDispatch::Invoke() method,这是完成工作的那个。使用默认成员只需通过为第一个参数传递0来完成。
解除您在对象浏览器中看到的怪癖,它完全假定COM对象支持自动化。