Метод IMoniker::BindToStorage (objidl.h)

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

Синтаксис

HRESULT BindToStorage(
  [in]  IBindCtx *pbc,
  [in]  IMoniker *pmkToLeft,
  [in]  REFIID   riid,
  [out] void     **ppvObj
);

Параметры

[in] pbc

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

[in] pmkToLeft

Если моникер является частью составного моникера, указатель на моникер слева от этого моникера. Этот параметр в основном используется средствами реализации моникера для обеспечения взаимодействия между различными компонентами составного моникера. Клиенты моникера должны использовать значение NULL.

[in] riid

Ссылка на идентификатор запрошенного интерфейса хранилища, указатель которого будет возвращен в ppvObj. Часто запрашиваемые интерфейсы хранилища включают IStorage, IStream и ILockBytes.

[out] ppvObj

Адрес переменной указателя, получающей указатель интерфейса, запрошенный в riid. После успешного возврата *ppvObj содержит запрошенный указатель интерфейса на хранилище объекта, который идентифицирует моникер. При успешном выполнении реализация должна вызвать AddRef для хранилища. Вызов Release лежит на вызывающем объекте. При возникновении ошибки значение *ppvObj должно иметь значение NULL.

Возвращаемое значение

Этот метод может возвращать стандартные возвращаемые значения E_UNEXPECTED, а также следующие значения.

Код возврата Описание
S_OK
Операция привязки выполнена успешно.
MK_E_NOSTORAGE
Объект, идентифицируемый этим моникером, не имеет собственного хранилища.
MK_E_EXCEEDEDDEADLINE
Операция привязки не может быть завершена в течение срока, заданного структурой BIND_OPTS контекста привязки.
MK_E_CONNECTMANUALLY
Операции не удалось подключиться к хранилищу, возможно, из-за того, что не удалось подключить сетевое устройство. Дополнительные сведения см. в разделе IMoniker::BindToObject.
MK_E_INTERMEDIATEINTERFACENOTSUPPORTED
Был найден промежуточный объект, но он не поддерживал интерфейс, необходимый для выполнения операции привязки. Например, моникер элемента возвращает это значение, если его контейнер не поддерживает интерфейс IOleItemContainer .
STG_E_ACCESSDENIED
Не удается получить доступ к объекту хранилища.
 

Этот метод также может возвращать ошибки, связанные с методом IOleItemContainer::GetObject .

Комментарии

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

Примечания к вызывающим абонентам

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

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

Примечания для разработчиков

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

Если в структуре BIND_OPTS контекста привязки указан флаг BINDFLAGS_JUSTTESTEXISTENCE, реализация имеет возможность возвращать значение NULL в ppvObj (хотя флаг можно также игнорировать и выполнить полную операцию привязки).

Примечания по реализации

Реализация Примечания
Антимоникер Этот метод возвращает E_NOTIMPL.
Моникер класса Этот метод перенаправляет в моникер класса BindToObject.
Файловый моникер Этот метод открывает файл, указанный путем, представленным моникером, и возвращает указатель IStorage на этот файл. Метод поддерживает привязку только к интерфейсу IStorage ; Если IStream или ILockBytes запрашивается в riid, метод возвращает E_UNSPEC, а если запрашиваются другие интерфейсы, этот метод возвращает E_NOINTERFACE. Если pmkToLeft не является моникером класса, pmkToLeft должен иметь значение NULL, как в реализации IMoniker::BindToObject.
Универсальный составной моникер Этот метод рекурсивно вызывает BindToStorage в крайнем правом компоненте составного компонента, передавая остальную часть составной части в качестве параметра pmkToLeft для этого вызова.
Моникер элемента Если значение pmkToLeft равно NULL, этот метод возвращает E_INVALIDARG. В противном случае метод вызывает IMoniker::BindToObject для параметра pmkToLeft , запрашивая указатель интерфейса IOleItemContainer . Затем метод вызывает IOleItemContainer::GetObjectStorage для запрошенного интерфейса.
Моникер OBJREF Этот метод получает маршалированные указатели на запрошенный интерфейс в хранилище, которое содержит выполняющийся объект. Так как моникер OBJREF представляет выполняющийся объект, активация не выполняется. Если представленный объект больше не выполняется, BindToStorage завершается сбоем с E_UNEXPECTED.
Моникер указателя Этот метод запрашивает заключенный в оболочку указатель для запрошенного интерфейса.
Моникер URL-адреса Системная реализация моникеров URL-адресов поддерживает BindToStorage для потоковых объектов по всем URL-адресам и для объектов хранения в случае, когда назначенный ресурс является составным файлом.

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

  • Моникер URL-адреса извлекает дополнительные сведения для операции привязки из контекста привязки. Например, моникер может получить указатели на интерфейсы IBindStatusCallback и IEnumFORMATETC , зарегистрированные в контексте привязки. Дополнительные сведения могут включать дополнительные параметры привязки, указанные в контексте привязки через IBindCtx::SetBindOptions, например параметр dwTickCountDeadline или значение grfFlags BIND_MAYBOTHERUSER. Затем моникер запрашивает клиент путем вызова IBindStatusCallback::GetBindInfo и инициирует операцию привязки с транспортом и передает клиенту результирующий IBinding, вызвав IBindStatusCallback::OnStartBinding.
  • Если вызывающий объект запросил асинхронный IStream или IStorage путем указания флага BINDF_ASYNCSTORAGE в структуре BINDINFO , полученной из IBindStatusCallback::GetBindInfo, метод, моникер URL-адреса возвращает объект как можно скорее. Вызовы этих объектов IStorage или IStream , ссылающихся на данные, которые еще не доступны, возвращают E_PENDING.
  • Если вызывающий объект не указывает асинхронный IStream или IStorage , как описано выше, моникер URL-адреса по-прежнему возвращает объект через метод IBindStatusCallback::OnDataAvailable как можно скорее . Однако вызовы этих объектов, ссылающихся на данные, которые еще недоступны, будут блокироваться до тех пор, пока данные не станут доступными. Для некоторых приложений это потребует наименьшего изменения существующего кода ввода-вывода, но может по-прежнему привести к повышению производительности в зависимости от шаблонов доступа.

Требования

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

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

IMoniker