fonctionnement de la liaison asynchrone et du Stockage
Le stockage asynchrone améliore la spécification de stockage structuré COM afin de prendre en charge le téléchargement d’objets de stockage sur des réseaux à latence élevée et de 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 :
Le navigateur appelle la fonction MkParseDisplayName , en passant l’URL du lien.
MkParseDisplayName analyse l’URL, crée un moniker asynchrone correspondant et retourne un pointeur vers l’interface IMoniker du moniker.
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.
Le moniker est lié à l’objet et le interroge pour l’interface IPersistMoniker , qui indique si l’objet prend en charge la liaison asynchrone et le stockage. Si l’objet retourne un pointeur vers IPersistMoniker:
- Le moniker d’URL appelle IPersistMoniker :: Load, en passant son propre pointeur IMoniker à l’objet.
- 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.
- 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 l' ILockBytes sur le fichier temporaire.
- L’objet lit les données à partir du stockage et retourne à partir de IPersistMoniker :: Load lorsqu’il a reçu suffisamment de données pour s’en tenir 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 bloque une boucle de messages modale ou fait en sorte que le stockage asynchrone retourne E _ en attente, selon que l’objet a demandé ou non un stockage de blocage ou de non-blocage.
Si l’objet n’implémente pas IPersistMoniker, le moniker interroge la pour IPersistStorage, qui indique que l’état persistant de l’objet est stocké dans un objet de stockage. Si l’objet retourne un pointeur vers IPersistStorage:
- Le moniker appelle IMoniker :: BindToStorage sur lui-même, en demandant un blocage IStorage (car l’objet ne prend pas en charge 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 de stockage asynchrone. À mesure que les données arrivent (sur un thread d’arrière-plan), le moniker appelle IFillLockBytes pour remplir l' ILockBytes sur le fichier temporaire.
- L’objet lit les données à partir du stockage et retourne de IPersistStorage :: Load lorsqu’il a reçu suffisamment de données pour être initialisées. 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. À l’intérieur de la méthode IProgressNotify :: OnProgress , le thread de téléchargement se bloque toujours dans une boucle de messages modale.
Que le téléchargement soit synchrone ou asynchrone, le moniker retourne de IMoniker :: BindToObject, et le navigateur reçoit l’objet initialisé qu’il a demandé.
Le navigateur interroge IOleObject et héberge l’objet sous la forme d’un objet document. (À ce stade, l’objet ne peut pas être initialisé complètement, mais suffisant pour afficher un résultat utile, auquel cas le téléchargement se poursuit en arrière-plan.)