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