Partager via


Fonctionnement de la liaison asynchrone et du stockage

Le stockage asynchrone améliore la spécification de stockage structuré COM pour prendre en charge le téléchargement d’objets de stockage sur des réseaux à latence élevée et à liaison lente tels qu’Internet. Le stockage asynchrone fonctionne avec les monikers asynchrones pour fournir un comportement de liaison asynchrone complet.

Objet document incorporé dans une page Web

Lorsqu’un utilisateur clique sur un lien représentant un document incorporé dans une page Web, les événements suivants se produisent :

  1. Le navigateur appelle la fonction MkParseDisplayName en passant l’URL du lien.

  2. MkParseDisplayName analyse l’URL, crée un moniker asynchrone correspondant et retourne un pointeur vers l’interface IMoniker du moniker.

  3. Le navigateur appelle IsAsyncMoniker pour déterminer si le moniker est asynchrone, crée un contexte de liaison, inscrit l’interface IBindStatusCallback avec le contexte de liaison, uniquement si le moniker est asynchrone et appelle IMoniker::BindToObject, en passant le contexte de liaison.

  4. Le moniker est lié à l’objet et l’interroge pour l’interface IPersistMoniker , qui indique si l’objet prend en charge la liaison et le stockage asynchrones. Si l’objet retourne un pointeur vers IPersistMoniker :

    1. Le moniker d’URL appelle IPersistMoniker::Load, en passant son propre pointeur IMoniker à l’objet .
    2. L’objet modifie le contexte de liaison, choisit s’il souhaite un stockage bloquant ou non bloquant, inscrit son propre IBindStatusCallback et appelle IMoniker::BindToStorage sur le pointeur qu’il a reçu via IPersistMoniker::Load.
    3. Le moniker crée un stockage asynchrone, conserve une référence à l’interface IFillLockBytes de l’objet wrapper, inscrit l’interface IProgressNotify sur le stockage racine et appelle IPersistStorage::Load, en passant le pointeur IStorage du stockage asynchrone. À mesure que les données arrivent (sur un thread d’arrière-plan), le moniker appelle IFillLockBytes pour remplir les ILockBytes sur le fichier temporaire.
    4. L’objet lit les données du stockage et retourne à partir de IPersistMoniker::Load lorsqu’il a reçu suffisamment de données pour se considérer comme initialisé. Si l’objet tente de lire des données qui n’ont pas encore été téléchargées, le téléchargeur reçoit une notification sur IProgressNotify. À l’intérieur de la méthode IProgressNotify::OnProgress , le thread de téléchargement se bloque dans une boucle de message modale ou renvoie le stockage asynchrone E_PENDING, selon que l’objet a demandé un stockage bloquant ou non bloquant.
  5. Si l’objet n’implémente pas IPersistMoniker, le moniker interroge IPersistStorage, ce qui indique que l’état persistant de l’objet est stocké dans un objet de stockage. Si l’objet retourne un pointeur vers IPersistStorage :

    1. Le Moniker appelle IMoniker::BindToStorage sur lui-même, demande un IStorage bloquant (car l’objet ne prend pas en compte l’asynchrone), crée un stockage asynchrone, conserve une référence à l’interface IFillLockBytes de l’objet wrapper, inscrit l’interface IProgressNotify sur le stockage racine et appelle IPersistStorage::Load, en passant le pointeur IStorage du stockage asynchrone. À mesure que les données arrivent (sur un thread d’arrière-plan), le moniker appelle IFillLockBytes pour remplir les ILockBytes sur le fichier temporaire.
    2. L’objet lit les données du stockage et retourne à partir de IPersistStorage::Load lorsqu’il a reçu suffisamment de données pour se considérer initialisé. Si l’objet tente de lire des données qui n’ont pas encore été téléchargées, il reçoit une notification sur IProgressNotify. Dans la méthode IProgressNotify::OnProgress , le thread de téléchargement se bloque toujours dans une boucle de message modale.
  6. Que le téléchargement soit synchrone ou asynchrone, le moniker retourne à partir de IMoniker::BindToObject, et le navigateur reçoit l’objet initialisé qu’il a demandé.

  7. Le navigateur interroge IOleObject et héberge l’objet en tant qu’objet Document. (À ce stade, l’objet peut ne pas être complètement initialisé, mais suffisant pour afficher quelque chose d’utile, auquel cas le téléchargement se poursuit en arrière-plan.)