Поделиться через


Реализация диспетчера категорий компонентов

По мере роста числа доступных компонентов становится все труднее управлять этими компонентами. С точки зрения предоставляемых интерфейсов, а также задач, которые они выполняют, многие компоненты предлагают аналогичные функциональные возможности.

Часто необходимо перечислить компоненты, которые можно использовать в определенном контексте. Примерами этого являются диалоговое окно "Вставка объекта", используемое в составных документах OLE, и диалоговое окно "Вставить элемент управления", используемое в элементах управления OLE. Эти диалоговые окна перечисляют все компоненты, которые выполняют (или утверждают для выполнения) контрактов интерфейса для составных документов или элементов управления. Эти существующие категории (OLE document, OLE control) не подразумевают точную подпись интерфейса. Документы OLE должны предоставлять определенный набор основных интерфейсов (например, IOleObject или IPersist служба хранилища), но также могут предоставлять дополнительные интерфейсы, такие как IOleLink.

В прошлом компоненты помечены путем добавления имени пользователя ("Insertable", "Control" и т. д.) в качестве подраздела в раздел реестра HKEY_CLASSES_ROOT\CLSID\{...} , соответствующий компоненту. Это хорошо подходит для центрального определения категорий, но рискует столкновения имен, когда многие независимые стороны определяют новые категории. Как и в других областях COM, решение для предоставления расширяемого пространства имен лежит в использовании глобальных уникальных идентификаторов (GUID). Вместо использования имени, доступного для чтения, для каждой категории назначается уникальное число (CATID).

Другое ограничение с существующей классификацией заключается в том, что оно ограничено выражением возможностей самого компонента. Многие компоненты требуют определенных возможностей из контейнеров. Если такой компонент вставляется в контейнер, вставка может непредвиденно или непредвиденно вести себя, даже если компонент выполняет контракты, подразумеваемые одной из ее категорий. Чтобы перечислить компоненты, которые можно использовать успешно в определенных ситуациях, необходимо учитывать возможности как компонента, так и контейнера.

Из-за этих соображений были внесены следующие изменения в существующую классификацию:

  • Категории указываются с помощью CATID, которые являются глобально уникальными идентификаторами.
  • В подразделе "Компоненты" раздела реестра HKEY_CLASSES_ROOT\CLSID были разработаны два отдельных подраздела "Реализованные категории" и "Обязательные категории". Эти подразделы содержат списки CATID, предоставляемые компонентом или контейнер компонента.

Чтобы упростить управление категориями компонентов, категории перечислены в центральном месте в реестре: HKEY_CLASSES_ROOT\Категории компонентов. Этот ключ перечисляет установленные категории как с их CATID, так и с локализованными именами, доступными для чтения человеком.

Дополнительные сведения см. в следующих разделах: