Моникеры элементов
Другим классом moniker, реализованным OLE, является моникер элемента, который можно использовать для идентификации объекта, содержащегося в другом объекте. Один из типов автономного объекта — это объект OLE, внедренный в составной документ. Составной документ может определить внедренные объекты, содержащиеся в нем, назначив каждое из них произвольное имя, например "embeddedobj1", "embeddedobj2", и т. д. Другой тип содержащегося объекта — это выбор пользователя в документе, например диапазон ячеек в электронной таблице или диапазон символов в текстовом документе. Объект, состоящий из выделенного фрагмента, называется псевдо-объектом , так как он не обрабатывается как отдельный объект, пока пользователь не помечает выделение. Электронная таблица может определить диапазон ячеек с помощью такого имени, как "1A:7F", в то время как текстовый документ может определить диапазон символов с помощью имени закладки.
Моникер элементов полезен в первую очередь при объединениях или создании с другим моникером, который идентифицирует контейнер. Обычно создается моникер элементов, а затем создается на (например) моникер файла, чтобы создать эквивалент полного пути к объекту. Например, можно создать моникер файла "c:\work\report.doc" (который идентифицирует объект контейнера) с моникером элемента "embedobj1" (который определяет объект в контейнере), чтобы сформировать моникер "c:\work\report.doc\embedobj1", который однозначно идентифицирует конкретный объект в определенном файле. Кроме того, можно объединить дополнительные моникеры элементов, чтобы определить глубоко вложенные объекты. Например, если "embedobj1" — это имя объекта электронной таблицы, чтобы определить определенный диапазон ячеек в этом объекте электронной таблицы, можно добавить другой моникер элемента для создания моникера, который будет эквивалентом "c:\work\report.doc\embedobj1\1A:7F".
При сочетании с моникером файла моникер элементов формирует полный путь. Таким образом, моникеры элементов расширяют понятие имен путей за пределами файловой системы, определяя имена путей для идентификации отдельных объектов, а не только файлов.
Существует значительное различие между моникером элемента и моникером файла. Путь, содержащийся в моникере файла, имеет смысл любому, кто понимает файловую систему, в то время как частичный путь, содержащийся в моникере элемента, имеет смысл только для конкретного контейнера. Все знают, к чему относится c:\work\report.doc, но только один конкретный объект контейнера знает, к чему относится "1A:7F". Один контейнер не может интерпретировать моникер элемента, созданный другим приложением; единственный контейнер, который знает, какой объект ссылается моникером элемента, является контейнером, который назначил моникер элемента объекту в первую очередь. По этой причине источник объекта с именем сочетания файла и моникера элементов должен не только реализовать IPersistFile, чтобы упростить привязку моникера файла, но и IOleItemContainer для упрощения разрешения имени моникера элемента в соответствующий объект в контексте файла.
Преимущество моникеров заключается в том, что кто-то, использующий моникер для поиска объекта, не должен понимать имя, содержащееся в моникер элемента, если моникер элемента является частью составного. Как правило, это не имеет смысла для моникера элемента существовать самостоятельно. Вместо этого вы создайте моникер элемента на моникер файла. Затем вы вызовете IMoniker::BindToObject в составном элементе, который привязывает отдельные моникеры внутри него, интерпретируя имена.
Чтобы создать объект moniker элемента и вернуть указатель на поставщика моникера, OLE предоставляет вспомогательные функции CreateItemMoniker. Эта функция создает объект moniker элемента и возвращает указатель на поставщика.
См. также