Мой вопрос похож на Получение CLSID для DLL-файла? , я думаю.
У меня есть каталог с некоторыми DLL, каждая из которых реализует один или несколько COM-интерфейсов. Я хотел бы получить:
1) Каждое имя интерфейса
2) CLSID класса, реализующего интерфейс
Для каждой DLL. Важно, чтобы все могло быть сделано программно (поэтому я не могу использовать какой-либо браузер COM и вручную искать эту информацию).
Позже я буду искать CLSID по имени интерфейса и вызывать некоторые методы, используя IDispatch.
Одна из альтернатив, похоже, сканирует реестр, пытаясь сопоставить тип, интерфейс и класс GUID и имя файла .dll. Но это кажется медленным и не надежным.
Есть ли у кого-нибудь ясное решение этой проблемы?
EDIT:
С ответом Бена Фойгта я пришел со следующим кодом, который соответствует моим потребностям:
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
}
}
}