Re: Поиск ConnectionPoint'ов, если известен только ProgID
От: Vi2 Удмуртия http://www.adem.ru
Дата: 30.10.06 07:32
Оценка:
Здравствуйте, Maratius, Вы писали:

M>Есть сторонний ActiveX-контрол, выставляющий несколько интерфейсов через механизм ConnectionPoint'ов. Как я понял, стандартный дельфёвский мастер импорта ActiveX-ов не мудрствует: вытягивает выставляемые через IConnectionPointContainer интерфейсы, IPropertyNotifySink пропускает (обрабатывает специфически), а, видимо, первый попавшийся не IPropertyNotifySink оборачивает классом и позволяет получать соответствующие калбэки.

M>Иногда удобно, но мало.

Неверно. Нет никаких вытягиваний IConnectionPointContainer, потому что эта операция — времени выполнения, а не компиляции или дизайна. Обычно анализируется библиотека типов, в которой для каждого класса указан событийный интерфейс по умолчанию ([default, source]).

M>CLSIDFromProgId'ом легко находится guid текущей версии контрола, а вот как наиболее правильно затратно найти нужный мне ConnectionInterface?


M>Сейчас так: у уже созданного инстанса контрола запрашивается IConnectionPointContainer, далее EnumConnectionPoints — в общем, IConnectionPoint'ы известны, через их GetConnectionInterface известны IID'ы выставляемых ConnectionInterface'ов. IID-ы — это то, что лежит в HKCR\Interface\{iid}. Вытягиваю оттуда TypeLib и Version. Гружу, получаю ITypeLib, оттуда беру ITypeInfo для IID'ов ConnectionInterface'ов и тупо сравниваю наборы и объявления методов с нужным.


Контролы обычно поддерживают интерфейс IProvideClassInfo (и выше), который через GetClassInfo вернет интерфейс ITypeInfo с методом GetContainingTypeLib, возвращающем ITypeLib библиотеки типов контрола, в котором описаны все тебе нужные событийные интерфейсы.

M>Возможно ли по CLSID получить LibID (guid библиотеки типов), если в ветке HKCR\CLSID\{clsid_того_контрола} не прописаны ни TypeLib, ни Version, и о чём это говорит — я не знаю


Если только пройти перебором по всем зарегистрированным библиотекам типа и в каждой посмотреть описан ли нужный кокласс с CLSID, но это так тягомотно, что проще сказать — не возможно.

M>Есть какие-то функции типа CSLIDFromProgID для IID'ов, чтобы не в реестре рыться, а вроде как через "официальный вход" ходить? (для получения, например, ProxyStubCLSID32, TypeLib)


Нет, таких функций нет.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.