如何从 ITypeLib 指针获取 TypeLibInfo? 更新

问题描述

我想使用 tlbinf32.dll 来读取 COM 对象的类型信息。目前我可以访问指向 ITypeLib 接口的指针。我可以使用 VTable 偏移量和 dispCallFunc 手动调用方法和导航门,但我希望使用该库的强大内置功能

我在想,既然 TLI.ClassInfoFromObject(Object As IUnkNown) 可用于查询 Idispatch::GetTypeInfo 方法,我可以手动构造一个仅实现此方法的虚拟对象,以允许将 TypeInfo 读入内存。类似于 manually defining IEnumVariant,其中大多数方法只返回 E_NOTIMPL = &H80004001。这听起来可行吗?是否有使用 VBA 从指针访问 TypeInfo 的更简单方法


更新

说清楚,我的问题是我找不到声明 ITypeInfo 接口并允许我直接使用它的方法 - VBA 从 stole2.tlb 访问 IUnkNown 所以我可以很好地使用它,但是我能找到声明的 ITypeInfo 的唯一地方是在 mscorlib.dll 中,但它 doesn't have the COMVisible attribute 因此无法在 VBA、AFAIK 中访问它,并且 VBA 没有等效的 [ComImport] 来让您自己定义一个 GUID。所以我想使用 tlbinf32.dll 来避免我不得不使用原始指针。

解决方法

原来 tlbinf32.dll 支持开箱即用,但它是隐藏的。来自帮助文件:

ITypeLib As IUnknown
TypeLibInfoFromITypeLib(ByVal ptlib As IUnknown) As TypeLibInfo

在每个 TypeLibInfo 中都有一个对 ITypeLib 实例的引用。在 事实上,TypeLibInfo 对象可以看作是 比 ITypeLib 更易于编程的 ITypeLib 接口 本身。查看两个 TypeLibInfo 对象是否实际上引用了相同的对象 内部对象,使用 VB 的 Is 运算符和 ITypeLib 属性 两个对象。 Is 运算符通常会返回 False 实际上对应于相同底层的 TypeLibInfo 对象 类型,但不适用于内部 ITypeLib 指针。 ITypeLib 属性是可设置的,因此您可以将 TypeLibInfo 对象放在 现有的 ITypeLib。

如果你有一个 ITypeLib 引用并且想要使用 TLI 对象,那么 你可以调用 TLI.TypeLibInfoFromITypeLib 来生成一个完整的 功能性 TypeLibInfo 对象。

ITypeLib 属性和 TypeLibInfoFromITypeLib 方法是 被视为高级功能并标记为隐藏。

强调我自己

... ITypeInfo 指针的类似故事

那怎么用呢?非常简单。首先是从指针获取 IUnknown 的方法。例如:

Public Function ObjectFromObjPtr(ByVal Address As LongPtr) As IUnknown
    Dim result As IUnknown
    MemLongPtr(VarPtr(result)) = Address
    Set ObjectFromObjPtr = result
    MemLongPtr(VarPtr(result)) = 0
End Function

Private Property Let MemLongPtr(ByVal dest as LongPtr,ByVal value As LongPtr)
    CopyMemory ByVal dest,value,LenB(value)
End Property

接听电话

Dim ITypeLibPtr As LongPtr
ITypeLibPtr = ... 'get the raw pointer

Dim ITypeLibObj As IUnknown
Set ITypeLibObj = ObjectFromObjPtr(ITypeLibPtr)

Dim NiceTypeLib As tli.TypeLibInfo
Set NiceTypeLib = tli.TypeLibInfoFrom(ITypeLibITypeLibObj)

或类似的词

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...