Compartir a través de


Funcionamiento del enlace asincrónico y el almacenamiento

El almacenamiento asincrónico mejora la especificación de almacenamiento estructurado COM para admitir la descarga de objetos de almacenamiento en redes de vínculos lentos y de alta latencia, como Internet. El almacenamiento asincrónico funciona junto con monikers asincrónicos para proporcionar un comportamiento de enlace asincrónico completo.

Objeto de documento incrustado en una página web

Cuando un usuario hace clic en un vínculo que representa un documento incrustado en una página web, se producen los siguientes eventos:

  1. El explorador llama a la función MkParseDisplayName y pasa la dirección URL del vínculo.

  2. MkParseDisplayName analiza la dirección URL, crea un moniker asincrónico correspondiente y devuelve un puntero a la interfaz IMoniker del moniker .

  3. El explorador llama a IsAsyncMoniker para determinar si el moniker es asincrónico, crea un contexto de enlace, registra la interfaz IBindStatusCallback con el contexto de enlace, solo si el moniker es asincrónico y llama a IMoniker::BindToObject, pasando el contexto de enlace.

  4. El moniker se enlaza al objeto y lo consulta para la interfaz IPersistMoniker , que indica si el objeto admite el enlace asincrónico y el almacenamiento. Si el objeto devuelve un puntero a IPersistMoniker:

    1. El moniker de dirección URL llama a IPersistMoniker::Load, pasando su propio puntero IMoniker al objeto .
    2. El objeto modifica el contexto de enlace, elige si quiere un almacenamiento de bloqueo o no de bloqueo, registra su propio IBindStatusCallback y llama a IMoniker::BindToStorage en el puntero que recibió a través de IPersistMoniker::Load.
    3. El moniker crea un almacenamiento asincrónico, mantiene una referencia a la interfaz IFillLockBytes del objeto contenedor, registra la interfaz IProgressNotify en el almacenamiento raíz y llama a IPersistStorage::Load, pasando el puntero IStorage del almacenamiento asincrónico. A medida que llegan datos (en un subproceso en segundo plano), el moniker llama a IFillLockBytes para rellenar ILockBytes en el archivo temporal.
    4. El objeto lee los datos del almacenamiento y devuelve de IPersistMoniker::Load cuando ha recibido datos suficientes para considerarse inicializados. Si el objeto intenta leer datos que aún no se han descargado, el descargador recibe una notificación en IProgressNotify. Dentro del método IProgressNotify::OnProgress , el subproceso de descarga bloquea un bucle de mensajes modal o hace que el almacenamiento asincrónico devuelva E_PENDING, dependiendo de si el objeto ha solicitado un almacenamiento de bloqueo o no de bloqueo.
  5. Si el objeto no implementa IPersistMoniker, el moniker consulta IPersistStorage, que indica que el estado persistente del objeto se almacena en un objeto de almacenamiento. Si el objeto devuelve un puntero a IPersistStorage:

    1. El Moniker llama a IMoniker::BindToStorage en sí mismo, solicitando un IStorage de bloqueo (porque el objeto no es asincrónico), crea un almacenamiento asincrónico, mantiene una referencia a la interfaz IFillLockBytes del objeto contenedor, registra la interfaz IProgressNotify en el almacenamiento raíz y llama a IPersistStorage::Load, pasando el puntero IStorage del almacenamiento asincrónico. A medida que llegan datos (en un subproceso en segundo plano), el moniker llama a IFillLockBytes para rellenar ILockBytes en el archivo temporal.
    2. El objeto lee los datos del almacenamiento y devuelve de IPersistStorage::Load cuando ha recibido datos suficientes para considerarse inicializados. Si el objeto intenta leer datos que aún no se han descargado, recibe una notificación en IProgressNotify. Dentro del método IProgressNotify::OnProgress, el subproceso de descarga siempre se bloquea en un bucle de mensajes modal.
  6. Independientemente de si la descarga es sincrónica o asincrónica, el moniker devuelve de IMoniker::BindToObject y el explorador recibe el objeto inicializado que solicitó.

  7. El explorador consulta IOleObject y hospeda el objeto como un objeto document. (En este momento, es posible que el objeto no se inicialice completamente, pero lo suficiente para mostrar algo útil, en cuyo caso la descarga continúa en segundo plano).