COM 接口类型为 IDispatch 时的默认属性
本文关键字:默认 属性 IDispatch 接口类型 COM | 更新日期: 2023-09-27 18:31:02
在 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 对象浏览器中,我仍然看到标有"蓝点"的属性,并标记为"默认成员"。但。必须在 VBA 代码中显式指定项目。
有没有办法让 IUnknown 中的默认属性像在 IDispatch 中一样运行?
不,默认属性在很大程度上是一个仅适用于 IDispatch 派生接口的概念。 在 Debug.Print 语句中使用的后期绑定无法在 IUnknown 接口上工作,实现该接口的 coclass 没有调用由数字选择的函数所需的机制。
查看 IDispatch::Invoke() 方法,这是完成工作的方法。 使用默认成员只需为第一个参数传递 0 即可完成。
消除您在对象浏览器中看到的怪癖,它完全假定 COM 对象支持自动化。