【发布时间】:2011-01-10 21:46:59
【问题描述】:
我想我的问题类似于Getting CLSID for a DLL file?。
我有一个包含一些 DLL 的目录,每个 DLL 都实现一个或多个 COM 接口。我想得到:
1) 每个接口名称 2) 实现接口的类的CLSID
对于每个 DLL。重要的是一切都可以通过编程完成(所以我不能使用某种 COM 浏览器并手动查找该信息)。
稍后我将查找给定接口名称的 CLSID 并使用 IDispatch 调用一些方法。
另一种选择似乎是扫描注册表以尝试匹配类型、接口和类 GUID 以及 .dll 文件名。但这似乎很慢而且不够稳健。
有人对此问题有明确的解决方案吗?
编辑:
在 Ben Voigt 的回复下,我提供了以下适合我需要的代码:
ITypeLib *typelib;
ITypeInfo *typeinfo;
LoadTypeLibEx(_T("c:\\mydir\\mycom1"), REGKIND_NONE, &typelib);
for (UINT i = 0;i < typelib->GetTypeInfoCount();++i) {
TYPEKIND typekind;
typelib->GetTypeInfoType(i, &typekind);
if (typekind == TKIND_COCLASS) {
// class!
CComBSTR className;
TYPEATTR *typeattr;
typelib->GetTypeInfo(i, &typeinfo);
typeinfo->GetDocumentation(MEMBERID_NIL, &className, NULL, NULL, NULL);
typeinfo->GetTypeAttr(&typeattr);
GUID classGUID = typeattr->guid;
for (UINT j = 0;j < typeattr->cImplTypes;++j) {
// interface!
CComBSTR interfaceName;
HREFTYPE hreftype;
ITypeInfo *classtypeinfo;
typeinfo->GetRefTypeOfImplType(j, &hreftype);
typeinfo->GetRefTypeInfo(hreftype, &classtypeinfo);
classtypeinfo->GetDocumentation(MEMBERID_NIL, &interfaceName, NULL, NULL, NULL);
// associate interfaceName with classGUID here
}
}
}
【问题讨论】: