如何在程序中通过ProgID或CLSID获取一个类型库的路径或LIBID,而无需实例化该类型库中包含的COM类?
对于某些COM对象,可以通过注册表路径来实现此目的。
HKEY_CLASSES_ROOT\CLSID\{clsid}\TypeLib
但是有些COM对象没有
TypeLib
键,例如Word.Application
:
我如何确定这些COM对象的类型库路径或LIBID,而不实例化COM对象?
如何在程序中通过ProgID或CLSID获取一个类型库的路径或LIBID,而无需实例化该类型库中包含的COM类?
对于某些COM对象,可以通过注册表路径来实现此目的。
HKEY_CLASSES_ROOT\CLSID\{clsid}\TypeLib
TypeLib
键,例如Word.Application
:
我如何确定这些COM对象的类型库路径或LIBID,而不实例化COM对象?
类型库可能与给定的 CLSID
相关联,也可能不相关联。如果您在注册表上没有类型库引用,您可以尝试在运行时使用 IDispatch::GetTypeInfo
获取它。
没有类型库(或已注册的类型库)的 COM 类仍然是有效的 COM 类,因此您可能会发现它在没有类型库的情况下运行良好且可用。
你还有一种机会,就是找到托管COM服务器的二进制文件,无论它是 .EXE
、.DLL
还是 .OCX
,并尝试从其资源中加载类型库(通常在标识符为1的位置)。很多情况下,类型库就在那里。
Word.Application
,它将类型库存储在单独的文件中)。 - user128300正如您在问题中提到的,不是所有的COM对象都在注册表中具有 ID,甚至它们也没有被强制将其TypeLib发送到目标系统,但为了能够公开其对象信息,它们需要一个TypeLib。因此,通常它们的TypeLib信息存储在或中作为资源。您可以使用LoadTypeLib函数从指定模块中提取TypeLib信息作为ITypeLib,然后编写自己的,甚至提取资源,然后将其保存为<.tlb>。
LoadTypeLib
所需的文件路径? - user128300InprocHandler32
,InporcServer32
或LocalServer32
中查找模块,然后在调用LoadTypeLib
时使用它。 - BigBossLoadTypeLib
,它可以加载包含类型库和模块的类型库作为资源。 - BigBossWord.Application
,它将类型库存储在单独的文件中)。 - user128300GetTypeInfo
。这对您来说不是一个选项。也许你应该祈求奇迹 :) - BigBoss