【发布时间】:2021-04-11 06:14:03
【问题描述】:
我想使用 tlbinf32.dll 来读取 COM 对象的类型信息。目前我可以访问指向 ITypeLib 接口的指针。我可以使用 VTable 偏移量和 DispCallFunc 手动调用方法和导航,但是我希望使用该库的强大内置功能。
我在想,既然TLI.ClassInfoFromObject(Object As IUnknown) 可用于查询 IDispatch::GetTypeInfo 方法,我可以手动构造一个仅实现此方法的虚拟对象,以允许将 TypeInfo 读入内存。类似于manually defining IEnumVariant,其中大多数方法只返回E_NOTIMPL = &H80004001。这听起来可行吗?有没有更简单的方法可以使用 VBA 从指针访问 TypeInfo?
更新
需要明确的是,我的问题是我找不到声明 ITypeInfo 接口并允许我直接使用它的方法 - VBA 访问 IUnknownfrom stole2.tlb 所以我可以很好地使用它,但唯一的我可以在 mscorlib.dll 中找到声明的 ITypeInfo,但它是 doesn't have the COMVisible attribute,因此无法在 VBA、AFAIK 和 VBA 中访问它,并且 VBA 没有与 [ComImport] 等效的让您自己使用 GUID 定义它.所以我想使用 tlbinf32.dll 来避免我不得不使用原始指针。
【问题讨论】:
-
这需要细节和/或清晰性。 ITypeLib(和相关的接口)是描述类型库的原始低级接口,而 tlbinf32 是原始接口之上的自动化兼容库(为 VB/VBA 创建),它们有点做同样的事情,但针对不同的类型的客户。我不明白你想做什么?
-
@SimonMourier 完全正确;我已经通过一些 COM 黑客访问了原始接口,这让我获得了比简单地调用 IDispatch::GetTypeInfo 更详细的版本(我认为,这是 tlbinf32 在后台从自动化对象实例中获取 typeinfo 的方法)。现在我有了原始接口,我想以某种方式将其读入 tlbinf32.dll 以获得更高程度的抽象。希望这是有道理的?
-
@SimonMourier 另见更新:) 澄清
-
如果你有一个 ITypeLib 引用,那么这个类型库是从某个地方加载的。您应该能够获取此类型的库信息并从 tlbinf32 从头开始加载它
-
如果您有 ITypeLib 引用,ITypeLib::GetLibAttr 应该为您提供类型库信息 (TLIBATTR) docs.microsoft.com/en-us/windows/win32/api/oaidl/…,您可以使用该信息通过 tlbinf32 从头开始加载它。
标签: vba com ole typelib tlbinf32