如何从ProgID或CLSID获取类型库(不加载COM对象)?

时间:2012-10-19 13:28:36

标签: c++ com

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

对于某些COM对象,您可以通过注册表路径

执行此操作
HKEY_CLASSES_ROOT\CLSID\{clsid}\TypeLib

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

enter image description here

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

2 个答案:

答案 0 :(得分:2)

类型库可能或可能与给定的CLSID无关。如果您在注册表上没有类型库引用,那么使用IDispatch::GetTypeInfo在运行时获取它可能会更好。

没有类型库的COM类(矿石注册类型库)仍然是一个有效的COM类,因此您可能最终运行良好并且可以在没有类型库的情况下使用。

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

答案 1 :(得分:0)

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