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


Интерфейс IMoniker (objidl.h)

Позволяет использовать объект моникера, который содержит сведения, однозначно определяющие COM-объект. Объект, имеющий указатель на интерфейс IMoniker объекта моникера, может находить, активировать и получать доступ к идентифицируемому объекту, не имея других конкретных сведений о расположении объекта в распределенной системе.

Моникеры используются в качестве основы для связывания в COM. Связанный объект содержит моникер, определяющий его источник. Когда пользователь активирует связанный объект для его изменения, моникер привязывается; при этом источник ссылки загружается в память.

Наследование

Интерфейс IMoniker наследуется от IPersistStream. IMoniker также имеет следующие типы элементов:

Методы

Интерфейс IMoniker содержит следующие методы.

 
IMoniker::BindToObject

Привязывается к указанному объекту. Процесс привязки включает в себя поиск объекта, его перевод в состояние выполнения при необходимости и предоставление вызывающему объекту указателя на указанный интерфейс для идентифицированного объекта.
IMoniker::BindToStorage

Привязывается к хранилищу для указанного объекта. В отличие от метода IMoniker::BindToObject, этот метод не активирует объект, определенный моникером.
IMoniker::CommonPrefixWith

Создает новый моникер на основе префикса, общего с указанным моникером.
IMoniker::ComposeWith

Создает новый составной моникер путем объединения текущего моникера с указанным моникером.
IMoniker::Enum

Извлекает указатель на перечислитель для компонентов составного моникера.
IMoniker::GetDisplayName

Извлекает отображаемое имя для моникера.
IMoniker::GetTimeOfLastChange

Извлекает время последнего изменения объекта, определенного этим моникером.
IMoniker::Hash

Создает хэш-значение, используя внутреннее состояние моникера.
IMoniker::Inverse

Создает моникер, который является обратным этому моникеру. Если он состоит справа от этого моникера или одного из аналогичных структур, моникер будет составлять ни к чему.
IMoniker::Isequal

Определяет, идентичен ли этот моникер указанному моникеру.
IMoniker::IsRunning

Определяет, загружен и запущен ли объект, определенный этим моникером.
IMoniker::IsSystemMoniker

Определяет, является ли этот моникер одним из предоставляемых системой классов моникеров.
IMoniker::P arseDisplayName

Преобразует отображаемое имя в моникер.
IMoniker::Reduce

Сводит моникер к простейшей форме.
IMoniker::RelativePathTo

Создает относительный моникер между этим и указанным моникером.

Комментарии

Как и путь к файлу в файловой системе, моникер содержит сведения, позволяющие находить и активировать COM-объект. Моникеры могут идентифицировать любой тип COM-объекта, от объекта документа, хранящегося в файле, до выделения во внедренном объекте. COM предоставляет набор классов моникеров, которые позволяют создавать объекты моникера, определяющие наиболее часто встречающиеся в системе объекты. Например, может быть объект, представляющий диапазон ячеек в электронной таблице, который сам внедрен в текстовый документ, хранящийся в файле. В распределенной системе моникер этого объекта определяет расположение системы объекта, физическое расположение файла в этой системе, хранилище внедренного объекта в этом файле и, наконец, расположение диапазона ячеек во внедренном объекте.

Объект моникера поддерживает интерфейс IMoniker , производный от интерфейса IPersistStream и однозначно идентифицирующий один объект в системе. После того как объект, предоставляющий моникер, создал объект моникера, эти сведения нельзя изменить в пределах этого объекта. Если поставщик моникера изменяет сведения, он может сделать это только путем создания нового объекта моникера, который затем однозначно идентифицирует рассматриваемый объект.

Моникеры имеют следующие две важные возможности:

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

Реализация против моникера

Антимоникеры являются обратными реализациям COM для моникеров файлов, элементов и указателей. То есть анти-моникер, состоящий справа от моникера файла, элемента моникера или моникера указателя, не составляет ничего.

Если вы являетесь клиентом моникера, обычно не нужно использовать антимоникеры. Если вам нужен обратный моникер, следует вызвать IMoniker::Inverse. Например, если для удаления последней части составного моникера требуется обратная, используйте IMoniker::Enum для перечисления фрагментов моникера и вызовите обратный для крайней правой части. Вы не должны использовать анти-моникер для этой цели, потому что вы не можете быть уверены, что самый правильный кусок композитного считает анти-моникер его обратным.

Единственная ситуация, в которой вы должны явно использовать анти-моникер, когда вы пишете новый класс моникера и у вас нет особых требований к построению обратных моникеров. В этом случае вы можете вернуть антимоникеры из реализации инверсии. В вашей реализации IMoniker::ComposeWith вы должны уничтожить один из ваших моникеров для каждого антимоникера, с которым вы сталкиваетесь.

Используйте функцию CreateAntiMoniker для создания этих моникеров.

Реализация моникера класса

Моникеры класса — это моникеры, представляющие класс объекта. Моникеры класса привязываются к объекту класса класса, для которого они созданы.

Моникеры класса наиболее полезны в композиции с другими типами моникеров, такими как файловые моникеры или моникеры элементов. Моникеры классов также могут быть составлены справа от моникеров, поддерживающих привязку к интерфейсу IClassActivator . Это позволяет IClassActivator предоставлять доступ к объекту класса и экземплярам класса .

Чтобы использовать моникеры класса, необходимо использовать функцию CreateClassMoniker для создания этих моникеров.

Реализация моникера файла

Моникеры файлов — это моникеры, представляющие путь в файловой системе; моникер файла может идентифицировать любой объект, сохраненный в собственном файле. Чтобы определить объекты, содержащиеся в файле, можно создать моникеры других классов (например, моникеры элементов) справа от моникера файла. Однако моникер слева от моникера файла в составном объекте должен быть другим моникером файла, анти-моникером или моникером класса. Например, моникер элемента не может отображаться слева от моникера файла в составном элементе.

Обратите внимание, что антимоникер является обратным для всего моникера файла, а не обратным компонентом пути, который представляет моникер; то есть при создании антимоникера справа от моникера файла удаляется весь моникер файла. Если вы хотите удалить только самый правый компонент пути, представленного моникером файла, необходимо создать отдельный моникер файла на основе пути "..", а затем создать его в конце моникера файла.

Клиенту моникера (с помощью моникера для получения указателя интерфейса на объект) обычно не требуется знать класс моникера; он может просто вызывать методы с помощью указателя интерфейса IMoniker .

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

Чтобы использовать файловые моникеры, необходимо использовать функцию CreateFileMoniker для создания моникеров. Чтобы разрешить загрузку объектов при привязке моникера файла, объекты должны реализовывать интерфейс IPersistFile .

Наиболее распространенным примером поставщиков моникеров являются приложения COM-сервера, поддерживающие связывание. Если приложение COM-сервера поддерживает компоновку только файловых документов в полном объеме, моникеры файлов являются единственным нужным типом моникера. Если приложение COM-сервера поддерживает связывание с объектами меньше документа (например, разделами документа или внедренными объектами), необходимо использовать моникеры элементов и файловые моникеры.

Реализация универсального составного моникера

Универсальный составной моникер — это составной моникер, компоненты которого не обладают специальными знаниями друг о друге.

Композиция — это процесс объединения двух моникеров вместе. Иногда два моникера определенных классов могут быть объединены особым образом; Например, моникер файла, представляющий неполный путь, и другой моникер файла, представляющий относительный путь, можно объединить для формирования одного моникера файла, представляющего полный путь. Это пример неуниверсийной композиции. Общая композиция, с другой стороны, может соединять любые два моникера, независимо от их классов. Поскольку негенерическая композиция зависит от класса участвующих моникеров, она может выполняться только реализацией метода IMoniker::ComposeWith определенного класса. Если написать новый класс моникера, можно определить новые типы негенерных композиций. В отличие от этого, универсальные композиции выполняются функцией CreateGenericComposite .

Клиенту моникера (с помощью моникера для получения указателя интерфейса на объект) обычно не требуется знать класс моникера или является ли он универсальным составным или негенерическим составным; он может просто вызывать методы с помощью указателя интерфейса IMoniker .

Поставщику моникеров (раздающим моникеры, которые идентифицируют его объекты, чтобы сделать их доступными для клиентов моникера) может потребоваться создать два моникера вместе. (Например, если вы используете моникер элемента для идентификации объекта, его необходимо создать с помощью моникера, идентифицируя контейнер объекта, прежде чем передавать его.) Для этого используйте метод IMoniker::ComposeWith , вызвав метод для первого моникера и передав второй в качестве параметра; Этот метод может создавать универсальный или необщичный составной элемент.

Единственный раз, когда необходимо явно создать универсальный составной моникер, — это написание собственного класса моникера. В реализации IMoniker::ComposeWith по возможности следует пытаться выполнить необщиническую композицию; Если невозможно выполнить необщиническую композицию и универсальная композиция допустима, можно вызвать функцию CreateGenericComposite , чтобы создать универсальный составной моникер.

Реализация моникера элемента

Моникеры элементов используются для идентификации объектов в контейнерах, таких как часть документа, внедренный объект в составном документе или диапазон ячеек в электронной таблице. Моникеры элементов часто используются в сочетании с файловыми моникерами; моникер файла используется для идентификации контейнера, а моникер элемента — для идентификации элемента в контейнере.

Моникер элемента содержит текстовую строку; Эта строка используется объектом контейнера для отличия содержащегося элемента от других. Объект контейнера должен реализовывать интерфейс IOleItemContainer ; Этот интерфейс позволяет коду моникера элемента получить указатель на объект, учитывая только строку, идентифицирующая объект .

Клиенту моникера (с помощью моникера для получения указателя интерфейса на объект) обычно не требуется знать класс моникера; он просто вызывает методы с помощью указателя интерфейса IMoniker .

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

Чтобы использовать моникеры элементов, необходимо использовать функцию CreateItemMoniker для создания моникеров. Чтобы разрешить загрузку объектов при привязке моникера элемента, контейнер объектов должен реализовывать интерфейс IOleItemContainer .

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

Реализация моникера OBJREF

Моникеры OBJREF представляют ссылку на экземпляр объекта, который выполняется на внепроцессном сервере локально или удаленно. Моникер идентифицирует экземпляр объекта и компьютер, на котором выполняется объект.

Моникер OBJREF во многих отношениях похож на моникер указателя, за исключением того, что выполняющийся объект находится вне процесса. Клиент может вызывать IMoniker::BindToObject по моникеру OBJREF и использовать получаемый указатель для доступа к выполняющемся объекту независимо от его расположения.

Важное отличие от моникера указателя заключается в том, что отображаемое имя моникера OBJREF может быть внедрено в HTML-страницу, а выполняющийся объект, представленный моникером, может быть привязан клиентским скриптом, апплетом или элементом ActiveX.

Основное использование моникера OBJREF — получение доступа к работающему экземпляру объекта через Интернет. Активная серверная страница или другие средства создания динамического HTML-содержимого помещают отображаемое имя моникера OBJREF в параметр в апплет или элемент управления ActiveX. Код апплета или элемента управления вызывает функцию CreateObjrefMoniker для создания моникера OBJREF на основе отображаемого имени, а затем вызывает IMoniker::BindToObject в полученном моникере OBJREF, чтобы получить доступ к выполняющимся экземпляру объекта. Затем страница активного сервера маршалирует указатель на выполняющийся объект обратно в клиент страницы.

Реализация моникера указателя

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

Экземпляры моникеров указателей отказываются сериализовать; То есть IPersistStream::Save вернет ошибку. Однако эти моникеры могут быть маршалированы в другой процесс в вызове RPC; На внутреннем уровне система маршалирует и отменяет маршалирование указателя, используя стандартную парадигму для маршалинга указателей интерфейса.

Моникеры указателей требуются редко. Используйте моникеры указателей, только если вам нужны моникеры для идентификации объектов, которые не имеют постоянного представления. Моникеры указателя позволяют таким объектам участвовать в операции привязки моникера.

Реализация моникера URL-адреса

Реализация моникера URL-адреса IMoniker находится в объекте моникера URL, который также поддерживает IUnknown и интерфейс IAsyncMoniker . Интерфейс IMoniker наследует свое определение от IPersistStream и IUnknown, а IPersistStream наследует от IPersist. Таким образом, реализация IMoniker включает поддержку IPersistStream и IPersist.

Интерфейс IAsyncMoniker — это просто интерфейс IUnknown. (Дополнительные методы отсутствуют.) Он позволяет клиентам определять, поддерживает ли моникер асинхронную привязку.

Чтобы получить указатель на интерфейс IMoniker для этого объекта, вызовите функцию CreateURLMonikerEx .

Клиенту моникера (с помощью моникера для получения указателя интерфейса на объект) обычно не требуется знать класс используемого моникера; он просто вызывает методы с помощью указателя интерфейса IMoniker .

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

Чтобы использовать моникеры элементов, необходимо использовать функцию CreateItemMoniker для создания моникеров. Чтобы разрешить загрузку объектов при привязке моникера элемента, контейнер объектов должен реализовывать интерфейс IOleItemContainer .

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

Требования

Требование Значение
Минимальная версия клиента Windows 2000 Профессиональная [классические приложения | Приложения UWP]
Минимальная версия сервера Windows 2000 Server [классические приложения | Приложения UWP]
Целевая платформа Windows
Header objidl.h

См. также раздел

CreateAntiMoniker

CreateClassMoniker

CreateFileMoniker

CreateGenericComposite

CreateItemMoniker

CreateObjrefMoniker

CreateURLMonikerEx

Моникеры