1

我有一个 ComClass 触发事件以从 API 获取价格。prices = priceAPI.getPrices返回具有多个属性的价格对象,例如 currentPrice、prevPrice 等

运行此代码的示例如下

Dim WithEvents priceAPI As newToolforUsers.ComClass

' this event is fired on update
Private Sub priceAPI_pricesUpdated()
    prices = priceAPI.getPrices
    For Each iprice In prices
        Debug.Print iprice.currentPrice
        Debug.Print iprice.prevPrice
        Debug.Print iprice.dailyHigh
        Debug.Print iprice.dailyLow
        Debug.Print iprice.dailyAvg
    Next
End Sub

API 偶尔会更新,但手动更新通常要晚几个月,所以我知道价格对象有更多新属性。

使用调试器会显示价格对象,<No Variables>尽管它已正确返回对象并且所有属性都是可用的。

在此处输入图像描述

对象浏览器似乎也没有显示价格对象的属性 在此处输入图像描述

有没有办法在 VBA 中找出 COM 对象的所有属性?

4

2 回答 2

4

调试器告诉你的是 Price 是一个后期绑定的IDispatch 接口。很常见,尤其是对于事件接口。这样的接口不会告诉你支持哪些属性和方法,你需要事先知道名称。然后 IDispatch::GetIDsOfNames() 会将名称映射到一个数字,即属性或方法的 DispId。然后在 IDispatch::Invoke() 中使用它来调用方法或属性 getter/setter。

这种映射是单向的,从名称到数字。不支持走另一条路。您应该从供应商或组件作者提供的文档中预先知道该名称。

您可以使用 OleView.exe 实用程序 File + View Typelib 命令查看嵌入在可执行文件中的类型库。您可能会在那里找到更好的价格声明。不过这种可能性不大。

于 2013-08-14T14:29:59.223 回答
4

给定 COM 对象,不能保证可以枚举其属性。您仍然可以尝试枚举属性访问类型信息,请参阅此问题中的详细信息: Visual Studio 的调试器/交互式窗口如何在 .NET 中转储 COM 对象的属性?

于 2013-08-14T14:11:29.807 回答