Método IMoniker::BindToStorage (objidl.h)

Enlaza al almacenamiento del objeto especificado. A diferencia del método IMoniker::BindToObject , este método no activa el objeto identificado por el moniker.

Sintaxis

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

Parámetros

[in] pbc

Puntero a la interfaz IBindCtx en el objeto de contexto de enlace, que se usa en esta operación de enlace. El contexto de enlace almacena en caché los objetos enlazados durante el proceso de enlace, contiene parámetros que se aplican a todas las operaciones mediante el contexto de enlace y proporciona los medios por los que la implementación del moniker debe recuperar información sobre su entorno.

[in] pmkToLeft

Si el moniker forma parte de un moniker compuesto, puntero al moniker a la izquierda de este moniker. Los implementadores de moniker usan este parámetro principalmente para permitir la cooperación entre los distintos componentes de un moniker compuesto. Los clientes de Moniker deben usar NULL.

[in] riid

Referencia al identificador de la interfaz de almacenamiento solicitada, cuyo puntero se devolverá en ppvObj. Las interfaces de almacenamiento solicitadas normalmente incluyen IStorage, IStream e ILockBytes.

[out] ppvObj

Dirección de la variable de puntero que recibe el puntero de interfaz solicitado en riid. Tras la devolución correcta, *ppvObj contiene el puntero de interfaz solicitado al almacenamiento del objeto que identifica el moniker. Cuando se ejecuta correctamente, la implementación debe llamar a AddRef en el almacenamiento. Es responsabilidad del autor de la llamada llamar a Release. Si se produce un error, *ppvObj debe ser NULL.

Valor devuelto

Este método puede devolver los valores devueltos estándar E_UNEXPECTED, así como los siguientes valores.

Código devuelto Descripción
S_OK
La operación de enlace se realizó correctamente.
MK_E_NOSTORAGE
El objeto identificado por este moniker no tiene su propio almacenamiento.
MK_E_EXCEEDEDDEADLINE
No se pudo completar la operación de enlace dentro del límite de tiempo especificado por la estructura de BIND_OPTS del contexto de enlace.
MK_E_CONNECTMANUALLY
La operación no pudo conectarse al almacenamiento, posiblemente porque un dispositivo de red no se pudo conectar. Para obtener más información, vea IMoniker::BindToObject.
MK_E_INTERMEDIATEINTERFACENOTSUPPORTED
Se encontró un objeto intermedio, pero no admitía una interfaz necesaria para completar la operación de enlace. Por ejemplo, un moniker de elemento devuelve este valor si su contenedor no admite la interfaz IOleItemContainer .
STG_E_ACCESSDENIED
No se puede acceder al objeto de almacenamiento.
 

Este método también puede devolver los errores asociados al método IOleItemContainer::GetObject .

Comentarios

Hay una diferencia importante entre los métodos BindToObject y BindToStorage . Si, por ejemplo, tiene un moniker que identifica un objeto de hoja de cálculo, llamar a BindToObject proporciona acceso al propio objeto de hoja de cálculo, mientras que al llamar a BindToStorage se proporciona acceso al objeto de almacenamiento en el que reside la hoja de cálculo.

Notas a los autores de llamadas

Aunque ninguna de las clases de moniker COM llama a este método en sus operaciones de enlace, podría ser adecuado llamarla en la implementación de una nueva clase de moniker. Puede llamar a este método en una implementación de BindToObject que requiere información del objeto identificado por el parámetro pmkToLeft y puede obtenerlo del almacenamiento persistente del objeto sin activación. Por ejemplo, si los monikers se usan para identificar objetos que se pueden activar sin activar sus contenedores, puede resultar útil este método.

Un cliente que puede leer el almacenamiento del objeto que identifica su moniker también podría llamar a este método.

Notas para los implementadores

La implementación debe localizar el almacenamiento persistente para el objeto identificado por el moniker actual y devolver el puntero de interfaz deseado. Algunos tipos de monikers representan pseudo-objetos, que son objetos que no tienen su propio almacenamiento persistente. Estos objetos componen parte del estado interno de su contenedor, por ejemplo, un rango de celdas de una hoja de cálculo. Si la clase moniker identifica este tipo de objeto, la implementación de BindToStorage debe devolver el error MK_E_NOSTORAGE.

Si la estructura de BIND_OPTS del contexto de enlace especifica la marca de BINDFLAGS_JUSTTESTEXISTENCE, la implementación tiene la opción de devolver NULL en ppvObj (aunque también puede omitir la marca y realizar la operación de enlace completa).

Notas específicas de la implementación

Implementación Notas
Anti-moniker Este método devuelve E_NOTIMPL.
Moniker de clase Este método reenvía al BindToObject de la clase moniker.
Moniker de archivo Este método abre el archivo especificado por la ruta de acceso representada por el moniker y devuelve un puntero IStorage a ese archivo. El método solo admite el enlace a la interfaz IStorage ; Si se solicita IStream o ILockBytes en riid, el método devuelve E_UNSPEC y, si se solicitan otras interfaces, este método devuelve E_NOINTERFACE. A menos que pmkToLeft sea un moniker de clase, pmkToLeft debe ser NULL, como en la implementación de IMoniker::BindToObject.
Moniker compuesto genérico Este método llama recursivamente a BindToStorage en el componente situado más a la derecha del compuesto, pasando el resto del compuesto como parámetro pmkToLeft para esa llamada.
Moniker de elemento Si pmkToLeft es NULL, este método devuelve E_INVALIDARG. De lo contrario, el método llama a IMoniker::BindToObject en el parámetro pmkToLeft y solicita un puntero de interfaz IOleItemContainer . A continuación, el método llama a IOleItemContainer::GetObjectStorage para la interfaz solicitada.
OBJREF moniker Este método obtiene un puntero serializado a la interfaz solicitada en el almacenamiento que contiene el objeto en ejecución. Dado que el moniker OBJREF representa un objeto en ejecución, no se realiza ninguna activación. Si el objeto representado ya no se está ejecutando, BindToStorage produce un error con E_UNEXPECTED.
Moniker de puntero Este método consulta el puntero ajustado para la interfaz solicitada.
Moniker de dirección URL La implementación del sistema de monikers url admite BindToStorage para objetos de secuencia en todas las direcciones URL y para objetos de almacenamiento en el caso de que el recurso designado sea un archivo compuesto.

Dado que el moniker de dirección URL admite el enlace asincrónico, el valor devuelto real de su BindToStorage puede variar en función de los parámetros de objeto establecidos en el contexto de enlace. Sin embargo, la semántica de la operación de enlace es idéntica, independientemente del uso sincrónico o asincrónico, como se indica a continuación:

  • El moniker de dirección URL extrae más información sobre la operación de enlace del contexto de enlace. Por ejemplo, el moniker puede obtener punteros a las interfaces IBindStatusCallback e IEnumFORMATETC registradas en el contexto de enlace. Puede incluir más opciones de enlace especificadas en el contexto de enlace a través de IBindCtx::SetBindOptions, como el parámetro dwTickCountDeadline o el valor grfFlags de BIND_MAYBOTHERUSER. A continuación, el moniker consulta al cliente llamando a IBindStatusCallback::GetBindInfo e inicia la operación de enlace con el transporte y pasa el IBinding resultante al cliente llamando a IBindStatusCallback::OnStartBinding.
  • Si el autor de la llamada solicitó un IStream o IStorage asincrónico especificando la marca de BINDF_ASYNCSTORAGE en la estructura BINDINFO recuperada de IBindStatusCallback::GetBindInfo, el método el moniker de dirección URL devuelve el objeto lo antes posible. Las llamadas a estos objetos IStorage o IStream que hacen referencia a datos que aún no están disponibles devuelven E_PENDING.
  • Si el autor de la llamada no especifica IStream o IStorage asincrónicos como se ha descrito anteriormente, el moniker de direcciones URL seguirá devolviendo un objeto a través del método IBindStatusCallback::OnDataAvailable tan pronto como sea posible. Sin embargo, las llamadas a estos objetos que hacen referencia a datos que aún no están disponibles se bloquearán hasta que los datos estén disponibles. En algunas aplicaciones, esto requerirá la menor modificación de su código de E/S existente, pero puede que el rendimiento sea mejorado en función de sus patrones de acceso.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado objidl.h

Consulte también

Imoniker