Мне нужно написать функцию, которая динамически извлекает progid из COM-объекта.
Это возможно?
Какой лучший способ сделать это?
РЕДАКТИРОВАТЬ: Все коклассы, которые мне нужны для обработки, реализуют IProvideClassInfo
Прежде всего, нет никакой гарантии, что информация доступна в первую очередь. Даже если вы только что создали экземпляр объекта, используя ProgID, вы можете не вернуть его обратно.
Самый простой — это запросить один из IPersist
и друзья (IPersistStream
и т.д.) интерфейсы и вызов IPersist::GetClassID
чтобы получить CLSID
, Затем преобразовать в ProgID, используя ProgIDFromCLSID
или через поиск в реестре.
Другой вариант — запросить IProvideClassInfo
а также IProvideClassInfo2
получить доступ к CLSID, представляющему интерес, таким альтернативным способом.
Третий вариант, если ни один из двух выше не работал, это запрос IDispatch
и попытаться открыть библиотеку типов, а затем перебрать поиск информации о классах.
Других решений пока нет …