- Моникер
-
Объект в архитектуре Microsoft COM.
Описание
Моникер является неизменяемым объектом, инициализируемым строкой, и имеющим операцию «создать экземпляр объекта из сохраненных данных, которые находятся в месте, указанном данной строкой». Иными словами, это реализация паттерна Строитель, инициализируемая строкой и не изменяемая.
Создание экземпляра «рабочего» объекта называется bind.
Для моникеров определены операции сравнения на равенство, а также операция композиции моникеров и разности моникеров (моникер, который в случае композиции с A даст B, метод называется RelativePathTo).
Главные типы моникеров:
- file moniker. Строка есть путь к файлу. Реализована композиция как сочетание путей и RelativePathTo. Bind означает — определение класса объекта по суффиксу имени файла, создание пустого экземпляра этого класса, получение у него интерфейса IPersistFile и затем вызов IPersistFile->Load().
- item moniker. Может использоваться только с правой стороны композиции. Результат композиции есть generic composite. Bind означает — получение интерфейса IOleItemContainer на «левосторонний» объект, и вызов IOleItemContainer->GetObject.
- generic composite. Хранит внутри себя 2 моникера — левый и правый. Bind означает — bind «левого» моникера, потом bind «правого», который всегда есть item moniker.
Функция ole32!MkParseDisplayName получает строку и создает объект «моникер» одного из вышеуказанных типов, используя синтаксис file!item!item!item для композитов.
Моникеры используются для вставки в один документ ссылок на другой по технологии OLE.
URL Moniker
Строка есть URL в стандартном синтаксисе.
В отличие от вышеуказанных моникеров, URL Moniker асинхронен — Bind возвращается сразу, а объект (и тем более объект с загруженным в него данными) получается куда позже. Для слежения за ходом привязки в моникере можно регистрировать bind status callbacks.
Сам загружаемый объект тоже может регистрировать bind status callbacks в своем же моникере (в случае, если объект поддерживает интерфейс IPersistMoniker), что служит для поддержки прогрессивной загрузки с перерисовкой экрана при «приезде» новой порции данных объекта.
Класс объекта получается следующими способами: — если протокол привязки поддерживает понятие Content-Type — то берется этот тип, и смотрится в реестре HKLM\MIME\Database — если нет — то используются типичные побайтовые паттерны в начале данных объекта — если и это не получилось — то используется суффикс имени файла в URL
Как только удалось определить класс объекта, процедура привязки (исполняется в фоновом потоке) создает экземпляр и оповещает об этом внешний мир через bind status callbacks. В этот момент внешний мир может, например, «усадить» созданный объект в окно Windows через интерфейсы OLE, показав его тем самым на экране.
Далее, если объект поддерживает IPersistMoniker, то моникер зовет этот интерфейс, предлагая объекту загрузится с себя. Объект регистрирует уже свои bind status callbacks и получает через них очередные порции данных.
Если IPersistMoniker отсутствует, то моникер использует следующие возможности:
- IPersistStream с созданием IStream на потоке данных моникера
- полную откачку всех данных в Temporary Internet Files, и затем загрузку их в объект через IPersistFile.
URL Moniker поддерживает различные bind protocols (объекты с интерфейсом IBindProtocol). Они должны быть зарегистрированы в реестре в таблице, поиск в ней идет по префиксу URL — http, ftp, ed2k и так далее.
Bind protocol открывает каким-то образом поток данных по переданному в него URL, качает данные, и также может возвращать те или иные атрибуты этих данных, такие, как Last-Modified и Content-Type.
Реализация URL Moniker находится в urlmon.dll, там же находится реализация bind protocols для http, https и ftp — они выполнены как обертки вокруг вызовов wininet.dll (последняя есть HTTP клиент).
Вызов urlmon!MkParseDisplayNameEx создает URL Moniker по строке URL.
URL Moniker используется в Microsoft Internet Explorer для всей загрузки страниц и вложенных в них объектов. Наличие «втыкаемых» bind protocols позволяет крайне легко втыкать в MSIE свои типы URL, такие, как ed2k://, а интерфейс IPersistMoniker облегчает написание обработчиков документов с поддержкой прогрессивной загрузки с веб-страницы.
POST формы в веб-странице также реализован как URL Moniker bind, данные формы при этом укладываются в специальный bind status callback.
Wikimedia Foundation. 2010.