如何找到COM对象的所有属性?

时间:2013-08-14 13:57:36

标签: vba com

我有一个ComClass,用于触发事件以从API获取价格。 prices = priceAPI.getPrices返回具有多个属性的price对象,例如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>,但它已正确返回对象并且所有属性都可用。

enter image description here

对象资源管理器似乎也没有透露价格对象的属性 enter image description here

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

2 个答案:

答案 0 :(得分:4)

给定COM对象,无法保证可以枚举其属性。您仍然可以尝试枚举属性访问类型信息,请参阅此问题中的详细信息: How does Visual Studio's debugger/interactive window dump the properties of COM Objects in .NET?

答案 1 :(得分:4)

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

这种映射从名称到数字是单向的。没有其他方式的支持。您应该从供应商或组件的作者提供的文档中预先知道名称。

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