如何解决如何从 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)
或类似的词
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。