Delen via


Opslaan in cache weergeven

Een containertoepassing moet een presentatie van een object kunnen verkrijgen om het voor gebruikers weer te geven of af te drukken wanneer het document is geopend, maar de servertoepassing van het object niet wordt uitgevoerd of niet is geïnstalleerd op de computer van de gebruiker. Stel je echter voor dat het onrealistisch is om aan te nemen dat de servers voor alle objecten die mogelijk in een document kunnen worden gevonden, op elke computer van elke gebruiker zijn geïnstalleerd en altijd op aanvraag kunnen draaien. De standaardobjecthandler, die altijd beschikbaar is, lost dit dilemma op door objectpresentaties in de opslag van het document op te slaan en deze presentaties te bewerken op elk platform, ongeacht de beschikbaarheid van de objectserver op een bepaalde installatie van de container.

Containers kunnen tekenpresentaties onderhouden voor een of meer specifieke doelapparaten, naast de apparaten die nodig zijn om het object op het scherm te onderhouden. Bovendien worden, als u het object van het ene platform naar het andere overgezet, de gegevensindelingen van het object automatisch geconverteerd naar de indelingen die op het nieuwe platform worden ondersteund. Als u bijvoorbeeld een object van Windows naar de Macintosh verplaatst, converteert OLE de metabestandpresentaties naar PICT-indelingen.

Als u een nauwkeurige weergave van een ingesloten object wilt presenteren aan de gebruiker, start de containertoepassing van het object een dialoogvenster met de objecthandler, waarbij gegevens en tekeninstructies worden aangevraagd. Om te kunnen voldoen aan de aanvragen van de container, moet de handler de IDataObject-, IViewObject2en IOleCache interfaces implementeren.

IDataObject stelt een OLE-containertoepassing in staat om gegevens op te halen uit en te verzenden naar de ingesloten of gekoppelde objecten. Wanneer gegevens in een object worden gewijzigd, biedt deze interface een manier voor het object om de nieuwe gegevens beschikbaar te maken voor de container en biedt de container een manier om de gegevens in de kopie van het object bij te werken. (Zie hoofdstuk 4, Gegevensoverdracht voor een bespreking van gegevensoverdracht in het algemeen.)

De interface IViewObject2 is erg vergelijkbaar met de interface IDataObject, behalve dat het een object vraagt om zichzelf te tekenen op een apparaatcontext, zoals een scherm, printer of metabestand, in plaats van de gegevens naar het geheugen of een ander overdrachtsmedium te verplaatsen of te kopiëren. Het doel van de interface is om een OLE-container in staat te stellen alternatieve afbeeldingsweergaven van de ingesloten objecten te verkrijgen, waarvan de gegevens al bestaan, waardoor de overhead wordt voorkomen dat er volledig nieuwe exemplaren van dezelfde gegevensobjecten moeten worden overgedragen om gewoon nieuwe tekeninstructies te verkrijgen. In plaats daarvan stelt de IViewObject2-interface de container in staat om een object te vragen een afbeelding van zichzelf te bieden door te tekenen op een apparaatcontext die is opgegeven door de container.

Wanneer u de IViewObject2-interface aanroept, kan een containertoepassing ook opgeven dat het object zich op een doelapparaat tekent dat anders is dan het doelapparaat waarop het object daadwerkelijk wordt weergegeven. Hierdoor kan de container, indien nodig, verschillende renderings genereren op basis van één object. De aanroeper kan bijvoorbeeld vragen om het object op te stellen voor een printer, ook al wordt de resulterende tekening op het scherm weergegeven. Het resultaat is natuurlijk een afdrukvoorbeeld van het object.

De interface IViewObject2biedt ook methoden waarmee containers zich kunnen registreren voor meldingen over weergavewijziging. Net zoals bij gegevens- en OLE-meldingen kan een weergaveadviesverbinding een container in staat stellen de weergaven van een object op een voor hem geschikt moment bij te werken, in plaats van als reactie op een aanroep van het object. Als een nieuwe versie van de servertoepassing van een object bijvoorbeeld extra weergaven van dezelfde gegevens zou bieden, zou de standaardhandler van het object de implementatie van elke container van IAdviseSink::OnViewChange- aanroepen om ze te laten weten dat de nieuwe presentaties beschikbaar waren. De container haalt deze informatie alleen op van de advise-sink wanneer dat nodig is.

Omdat Windows-apparaatcontexten slechts betekenis hebben binnen één proces, kunt u IViewObject2 niet doorgeven aanwijzers over procesgrenzen heen. Als gevolg hiervan hebben lokale en externe OLE-servers helemaal geen behoefte om de interface te implementeren, wat niet goed zou werken, zelfs niet als ze dat deden. Alleen objecthandlers en in-process-servers implementeren de interface IViewObject2. OLE biedt een standaard implementatie, die u kunt gebruiken in uw eigen OLE-in-processervers en objecthandlers door de OLE-standaardhandler samen te voegen. U kunt ook uw eigen implementatie van IViewObject2schrijven.

Een object implementeert de IOleCache interface om de handler te laten weten welke mogelijkheden het in de cache moet opslaan. De objecthandler is ook eigenaar van de cache en zorgt ervoor dat deze up-to-date blijft. Wanneer het ingesloten object in de actieve staat komt, stelt de handler de juiste adviesverbindingen op het serverobject in, waarbij het zelf als sink fungeert. De IDataObject- en IViewObject2interface-implementaties werken op basis van gegevens die aan de clientzijde worden gecachet. De implementatie van IViewObject2van de handler is verantwoordelijk voor het bepalen welke gegevensindelingen in de cache moeten worden gezet om te voldoen aan verzoeken van de cliënt voor tekeningen. De implementatie van IDataObject- van de handler is verantwoordelijk voor het ophalen van gegevens in verschillende formaten tussen het geheugen en de onderliggende IStorage instantie van het ingesloten object. Aangepaste handlers kunnen deze implementaties gebruiken door te aggregeren op de standaardhandler.

Notitie

De IViewObject2 interface is een eenvoudige functionele uitbreiding van IViewObject en moet worden geïmplementeerd in plaats van de laatste interface, die nu verouderd is. Naast het bieden van de IViewObject methoden, biedt de IViewObject2 interface één extra lid, GetExtent, waarmee een containertoepassing de grootte van de presentatie van een object uit de cache kan ophalen zonder eerst het object in de actieve status te hoeven verplaatsen met een aanroep naar IOleObject:: GetExtent.

 

samengestelde documenten