如果没有实例化COM对象,给定该类型库中包含的COM类的ProgID或CLSID,如何以编程方式获取类型库的路径或LIBID?
对于某些COM对象,您可以通过注册表路径
执行此操作HKEY_CLASSES_ROOT\CLSID\{clsid}\TypeLib
但是某些COM对象没有TypeLib
键,例如Word.Application
:
如何在不实例化COM对象的情况下确定这些COM对象的类型库路径或LIBID?
答案 0 :(得分:2)
类型库可能或可能与给定的CLSID
无关。如果您在注册表上没有类型库引用,那么使用IDispatch::GetTypeInfo
在运行时获取它可能会更好。
没有类型库的COM类(矿石注册类型库)仍然是一个有效的COM类,因此您可能最终运行良好并且可以在没有类型库的情况下使用。
您拥有的另一个机会是找到托管COM服务器的二进制文件,无论是.EXE
,.DLL
还是.OCX
,并尝试从其加载类型库资源(通常在标识符1下)。通常,类型库就在那里。
答案 1 :(得分:0)
正如您在问题中提到的,并非所有COM对象在注册表中都有TypeLib
ID,甚至他们也没有被强制将其TypeLib发送到目标系统,但为了能够公开其对象的信息,需要一个TypeLib。因此,他们的TypeLib信息作为资源存储在EXE
或DLL
中是很常见的。您可以使用LoadTypeLib函数从指定模块中提取ITypeLib的TypeLib信息,然后编写自己的IDL
,甚至提取资源,然后将其保存为.tlb
。