8

给定类型库中包含的 COM 类的 ProgID 或 CLSID,我如何以编程方式获取类型库的路径或 LIBID,而无需实例化 COM 对象?

对于某些 COM 对象,您可以通过注册表路径执行此操作

HKEY_CLASSES_ROOT\CLSID\{clsid}\TypeLib

但是有些 COM 对象没有TypeLib键,例如Word.Application

在此处输入图像描述

如何在不实例化 COM 对象的情况下确定这些 COM 对象的类型库路径或 LIBID?

4

2 回答 2

2

类型库可能与给定关联,也可能不关联CLSID。如果您在注册表中没有类型库引用,您可能会在运行时使用IDispatch::GetTypeInfo.

没有类型库的 COM 类(或注册类型库)仍然是有效的 COM 类,因此您最终可能会在没有类型库的情况下运行良好且可用。

您还有一个机会是找到托管 COM 服务器的二进制文件,无论它是.EXE.DLL还是.OCX,并尝试从其资源中加载类型库(通常在标识符 1 下)。很多时候,类型库就在那里。

于 2012-10-19T13:40:49.920 回答
0

正如您在问题中提到的,并非所有 COM 对象TypeLib在注册表中都有一个 ID,甚至它们也不会被迫将其 TypeLib 发送到目标系统,但为了能够公开其对象的信息,他们需要一个 TypeLib。因此,它们的 TypeLib 信息通常存储在EXEDLL作为资源中。您可以使用LoadTypeLib函数从指定模块中将 TypeLib 信息提取为ITypeLib,然后编写自己IDL的资源,甚至提取资源,然后将其保存为.tlb.

于 2012-10-19T13:52:30.580 回答