Afficher la mise en cache
Une application conteneur doit être en mesure d’obtenir une présentation d’un objet dans le but de l’afficher ou de l’imprimer pour les utilisateurs lorsque le document est ouvert, mais que l’application serveur de l’objet n’est pas en cours d’exécution ou n’est pas installée sur l’ordinateur de l’utilisateur. Toutefois, il est irréaliste de supposer que les serveurs de tous les objets qui pourraient être trouvés dans un document sont installés sur l’ordinateur de chaque utilisateur et peuvent toujours s’exécuter à la demande. Le gestionnaire d’objets par défaut, disponible à tout moment, résout ce dilemme en mettant en cache les présentations d’objets dans le stockage du document et en manipulant ces présentations sur n’importe quelle plateforme, quelle que soit la disponibilité du serveur d’objets sur une installation particulière du conteneur.
Les conteneurs peuvent gérer des présentations de dessin pour un ou plusieurs appareils cibles spécifiques en plus de celui requis pour maintenir l’objet à l’écran. En outre, si vous transférez l’objet d’une plateforme à une autre, OLE convertit automatiquement les formats de données de l’objet en formats pris en charge sur la nouvelle plateforme. Par exemple, si vous déplacez un objet de Windows vers Macintosh, OLE convertit ses présentations de métafichier en formats PICT.
Pour présenter une représentation précise d’un objet incorporé à l’utilisateur, l’application conteneur de l’objet lance un dialogue avec le gestionnaire d’objets, demandant des données et des instructions de dessin. Pour pouvoir répondre aux demandes du conteneur, le gestionnaire doit implémenter les interfaces IDataObject, IViewObject2 et IOleCache .
IDataObject permet à une application conteneur OLE d’obtenir des données à partir de et d’envoyer des données à ses objets incorporés ou liés. Lorsque les données changent dans un objet, cette interface permet à l’objet de mettre ses nouvelles données à la disposition de son conteneur et fournit au conteneur un moyen de mettre à jour les données dans sa copie de l’objet. (Pour plus d’informations sur le transfert de données en général, consultez le chapitre 4, Transfert de données.)
L’interface IViewObject2 ressemble beaucoup à l’interface IDataObject , sauf qu’elle demande à un objet de dessiner lui-même sur un contexte d’appareil, tel qu’un écran, une imprimante ou un métafichier, plutôt que de déplacer ou de copier ses données vers la mémoire ou un autre support de transfert. L’objectif de l’interface est de permettre à un conteneur OLE d’obtenir d’autres représentations picturales de ses objets incorporés, dont il dispose déjà des données, évitant ainsi la surcharge liée au transfert de toutes nouvelles instances des mêmes objets de données simplement pour obtenir de nouvelles instructions de dessin. Au lieu de cela, l’interface IViewObject2permet au conteneur de demander à un objet de fournir une représentation picturale de lui-même en dessinant sur un contexte d’appareil spécifié par le conteneur.
Lors de l’appel de l’interface IViewObject2 , une application conteneur peut également spécifier que l’objet se dessine lui-même sur un appareil cible différent de celui sur lequel il sera réellement rendu. Cela permet au conteneur, en fonction des besoins, de générer différents rendus à partir d’un seul objet. Par exemple, l’appelant peut demander à l’objet de composer lui-même pour une imprimante, même si le dessin résultant sera affiché à l’écran. Le résultat, bien sûr, serait un aperçu avant impression de l’objet.
L’interface IViewObject2fournit également des méthodes qui permettent aux conteneurs de s’inscrire aux notifications de modification d’affichage. Comme pour les données et les avis OLE, une connexion d’avis d’affichage permet à un conteneur de mettre à jour ses rendus d’un objet à sa convenance plutôt qu’en réponse à un appel de l’objet. Par exemple, si une nouvelle version de l’application serveur d’un objet devait offrir des vues supplémentaires des mêmes données, le gestionnaire par défaut de l’objet appelle l’implémentation de chaque conteneur d’IAdviseSink::OnViewChange pour lui faire savoir que les nouvelles présentations sont disponibles. Le conteneur ne récupère ces informations du récepteur de conseil que si nécessaire.
Étant donné que les contextes d’appareil Windows n’ont de signification qu’au sein d’un seul processus, vous ne pouvez pas passer les pointeurs IViewObject2 au-delà des limites de processus. Par conséquent, les serveurs locaux et distants OLE n’ont pas besoin d’implémenter l’interface, ce qui ne fonctionnerait pas correctement, même s’ils le faisaient. Seuls les gestionnaires d’objets et les serveurs in-process implémentent l’interface IViewObject2. OLE fournit une implémentation par défaut, que vous pouvez utiliser dans vos propres serveurs en cours de processus OLE et gestionnaires d’objets simplement en agrégeant le gestionnaire par défaut OLE. Vous pouvez également écrire votre propre implémentation d’IViewObject2.
Un objet implémente l’interface IOleCache afin de permettre au gestionnaire de savoir quelles fonctionnalités il doit mettre en cache. Le gestionnaire d’objets est également propriétaire du cache et veille à ce qu’il soit tenu à jour. Lorsque l’objet incorporé entre dans l’état d’exécution, le gestionnaire configure les connexions de conseil appropriées sur l’objet serveur, lui-même agissant comme récepteur. Les implémentations d’interface IDataObject et IViewObject2fonctionnent à partir des données mises en cache côté client. L’implémentation d’IViewObject2par le gestionnaire est chargée de déterminer les formats de données à mettre en cache afin de répondre aux demandes de dessin du client. L’implémentation d’IDataObject par le gestionnaire est responsable de l’obtention des données dans différents formats, etc., entre la mémoire et le instance IStorage sous-jacent de l’objet incorporé. Les gestionnaires personnalisés peuvent utiliser ces implémentations en agrégeant sur le gestionnaire par défaut.
Notes
L’interface IViewObject2 est une simple extension fonctionnelle d’IViewObject et doit être implémentée à la place de cette dernière, qui est désormais obsolète. En plus de fournir les méthodes IViewObject , l’interface IViewObject2 fournit un membre supplémentaire unique, GetExtent, qui permet à une application conteneur d’obtenir la taille de la présentation d’un objet à partir du cache sans avoir d’abord à déplacer l’objet dans l’état en cours d’exécution avec un appel à IOleObject::GetExtent.
Rubriques connexes