Вход/Регистрация
Интернет-журнал "Домашняя лаборатория", 2007 №6
вернуться

Журнал «Домашняя лаборатория»

Шрифт:

Указанные выше моникеры типов queue и new являются встроенными, т. е. мы можем использовать их не заботясь о их реализации. Моникер освобождает клиента от участия в процессе активации объекта. Этот процесс зависит от типа объекта, и без использования моникеров клиент должен входить во все детали (например, как активировать объект, состояние которого хранится в заданном файле). Каждый моникер реализует интерфейс IMoniker, скрывающий за стандартным фасадом все детали конкретного алгоритма активации.

Функция CoGetObject в нашем случае делает следующее:

1. Создает контекст связывания.

Связывание — процесс получения указателя на интерфейс некоторого объекта, что и является основной задачей любого моникера. Вызывается функция CreateBindContext, которая создает специальный объект — контекст связывания, который будет использоваться различными функциями, связанными с построением и использованием моникеров. Контекст связывания будет хранить данные, нужные в течение всего процесса связывания (например, ссылки на объекты, использующиеся в процессе связывания). Освобождается этот объект по завершении связывания, что значительно сокращает время связывания, т. к. каждая новая функция, вызывающаяся в процессе связывания, будет повторно использовать этот же контекст связывания и все хранящиеся в нем данные.

2. Создает моникер по его строке инициализации (текстовое представление моникера, display name).

Технология моникеров позволяет построить единое иерархическое пространство имен для объектов различных типов. Строка инициализации моникера, связанного с данным объектом, и может рассматриваться как его имя.

Вызывается функция MkParseDispiayName, которая получает на входе

— Указатель на контекст связывания (полученный в предыдущем пункте)

— Строку инициализации формируемого моникера

Выходными параметрами являются

— Длина начальной части строки инициализации, распознанная данной функцией

— Указатель на построенный моникер

В нашем случае строкой инициализации моникера является строка "queue: /new: Mу_Арр. My_Class". Слева от первого разделителя "стоит префикс — тип моникера (в нашем случае queue), который должен быть зарегистрирован как ProgID в реестре. Справа от этого разделителя стоит специфичное для данного типа моникера строка, которая хранит некоторую информацию об объекте, с которым должен быть связан этот моникер. В нашем случае эта строка является строкой инициализации еще одного моникера, тип которого new. Таким образом, в данном случае мы имеем композицию двух моникеров.

Алгоритм работы функции MkParseDispiayName:

5. Сканируется строка инициализации моникера и выделяется ее префикс — queue.

6. В реестре для ProgID queue ищется путь к реализации соответствующего класса моникера типа queue. Либо объект этого класса, либо его экземпляр реализует интерфейс IParseDisplayName.

7. В функцию IParseDisplayName::ParseDisplayName (с такими же параметрами, как и у функции MkParseDispiayName) передается еще не обработанный остаток строки инициализации — "new: Му_Арр. Му_Сlass".

8. Функция IParseDisplayName:: ParseDisplayName сканирует эту строку и выделяет тип нового моникера new и строку, описывающую объект, с которым должен связываться моникер типа new — "Mу_Арр. My_ciass". Ну и, конечно, формируется моникер типа queue.

9. В реестре для ProgID new ищется путь к реализации соответствующего класса моникера типа new. Либо объект этого класса, либо его экземпляр реализует интерфейс IParseDisplayName.

10. В функцию IParseDisplayName::ParseDisplayName передается еще не обработанный остаток строки инициализации — "Mу_Арр. My_ciass", который уже не содержит префикса - типа еще одного моникера. Формируется моникер типа new, который должен будет связываться с СОМ объектом с ProgID My_App.My_ciass.

11. В результате вызова функции CreateGenericComposite формируется моникер, являющийся композицией двух построенных выше моникеров типов queue и new. Указатель на этот моникер возвращается как результат работы функции MkParseDispiayName. Возвращается и число обработанных символов в строке инициализации (все символы обработаны).

3. Выполняет связывание построенного в предыдущем пункте моникера — композиции моникеров queue и new с СОМ объектом.

Для композиции моникеров вызывается функция IMoniker::BindToObject. Входными параметрами этой функции являются:

— Указатель на контекст связывания

— Указатель на моникер, стоящий в композиции слева от данного (в нашем случае такого нет)

— GUID запрашиваемого интерфейса объекта, с которым выполняется связывание.

  • Читать дальше
  • 1
  • ...
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: