Visualizzare la memorizzazione nella cache

Un'applicazione contenitore deve essere in grado di ottenere una presentazione di un oggetto allo scopo di visualizzarla o stamparla per gli utenti quando il documento è aperto, ma l'applicazione server dell'oggetto non è in esecuzione o non è installata nel computer dell'utente. Si supponga, tuttavia, che i server per tutti gli oggetti che potrebbero concepirsi in un documento siano installati nel computer di ogni utente e che possano essere sempre eseguiti su richiesta non è realistico. Il gestore di oggetti predefinito, disponibile in qualsiasi momento, risolve questo dilemma memorizzando nella cache le presentazioni degli oggetti nell'archivio del documento e modificando queste presentazioni su qualsiasi piattaforma indipendentemente dalla disponibilità del server oggetti in qualsiasi particolare installazione del contenitore.

I contenitori possono gestire presentazioni di disegno per uno o più dispositivi di destinazione specifici oltre a quello necessario per mantenere l'oggetto sullo schermo. Inoltre, se si esegue la conversione dell'oggetto da una piattaforma a un'altra, OLE converte automaticamente i formati di dati dell'oggetto in quelli supportati nella nuova piattaforma. Ad esempio, se si sposta un oggetto da Windows a Macintosh, OLE convertirà le presentazioni metafile in formati PICT.

Per presentare una rappresentazione accurata di un oggetto incorporato all'utente, l'applicazione contenitore dell'oggetto avvia un dialogo con il gestore oggetti, richiedendo dati e istruzioni di disegno. Per poter soddisfare le richieste del contenitore, il gestore deve implementare le interfacce IDataObject, IViewObject2 e IOleCache.

IDataObject consente a un'applicazione contenitore OLE di ottenere dati da e inviare dati ai relativi oggetti incorporati o collegati. Quando i dati cambiano in un oggetto, questa interfaccia consente all'oggetto di rendere disponibili i nuovi dati per il contenitore e fornisce al contenitore un modo per aggiornare i dati nella copia dell'oggetto. Per una descrizione generale del trasferimento dei dati, vedere Capitolo 4, Trasferimento dei dati.

L'interfaccia IViewObject2 è molto simile all'interfaccia IDataObject, ad eccezione del fatto che chiede a un oggetto di disegnare su un contesto di dispositivo, ad esempio uno schermo, una stampante o un metafile, anziché spostare o copiare i dati in memoria o in un altro supporto di trasferimento. Lo scopo dell'interfaccia è consentire a un contenitore OLE di ottenere rappresentazioni pictoriali alternative dei relativi oggetti incorporati, i cui dati sono già presenti, evitando così il sovraccarico di dover trasferire completamente nuove istanze degli stessi oggetti dati semplicemente per ottenere nuove istruzioni di disegno. Al contrario, l'interfaccia IViewObject2consente al contenitore di chiedere a un oggetto di fornire una rappresentazione grafica di se stessa disegnando su un contesto di dispositivo specificato dal contenitore.

Quando si chiama l'interfaccia IViewObject2 , un'applicazione contenitore può anche specificare che l'oggetto disegnare in un dispositivo di destinazione diverso da quello in cui verrà effettivamente eseguito il rendering. Ciò consente al contenitore, in base alle esigenze, di generare rendering diversi da un singolo oggetto. Ad esempio, il chiamante potrebbe chiedere all'oggetto di comporre se stesso per una stampante anche se il disegno risultante verrà sottoposto a rendering sullo schermo. Il risultato, ovviamente, sarebbe un'anteprima di stampa dell'oggetto.

L'interfaccia IViewObject2fornisce anche metodi che consentono ai contenitori di registrarsi per le notifiche di visualizzazione-modifica. Come per i dati e gli avvisi OLE, una connessione di avviso di visualizzazione consente a un contenitore di aggiornare i rendering di un oggetto in base alla propria comodità anziché in risposta a una chiamata dall'oggetto . Ad esempio, se una nuova versione dell'applicazione server di un oggetto offrisse visualizzazioni aggiuntive degli stessi dati, il gestore predefinito dell'oggetto chiamerebbe l'implementazione di ogni contenitore di IAdviseSink::OnViewChange per segnalare che le nuove presentazioni erano disponibili. Il contenitore recupera queste informazioni dal sink di avviso solo quando necessario.

Poiché i contesti di dispositivo Windows hanno un significato solo all'interno di un singolo processo, non è possibile passare puntatori IViewObject2 attraverso i limiti del processo. Di conseguenza, i server ole locali e remoti non hanno alcuna necessità di implementare l'interfaccia, che non funzionerebbe correttamente anche se lo facessero. Solo i gestori di oggetti e i server in-process implementano l'interfaccia IViewObject2. OLE fornisce un'implementazione predefinita, che è possibile usare nei server ole in-process e nei gestori oggetti semplicemente aggregando il gestore predefinito OLE. In alternativa, è possibile scrivere la propria implementazione di IViewObject2.

Un oggetto implementa l'interfaccia IOleCache per informare il gestore delle funzionalità che deve memorizzare nella cache. Il gestore dell'oggetto possiede anche la cache e garantisce che venga mantenuto aggiornato. Quando l'oggetto incorporato entra nello stato di esecuzione, il gestore configura le connessioni consultive appropriate sull'oggetto server, con la stessa funzione di sink. Le implementazioni dell'interfaccia IDataObject e IViewObject2escono dalla cache dei dati sul lato client. L'implementazione del gestore di IViewObject2è responsabile della determinazione dei formati di dati da memorizzare nella cache per soddisfare le richieste di disegno client. L'implementazione del gestore di IDataObject è responsabile del recupero dei dati in vari formati e così via, tra memoria e I Archiviazione istanza sottostante dell'oggetto incorporato. I gestori personalizzati possono usare queste implementazioni aggregando nel gestore predefinito.

Nota

L'interfaccia IViewObject2 è una semplice estensione funzionale di IViewObject e deve essere implementata invece di quest'ultima interfaccia, che è ora obsoleta. Oltre a fornire i metodi IViewObject, l'interfaccia IViewObject2 fornisce un singolo membro aggiuntivo, GetExtent, che consente a un'applicazione contenitore di ottenere le dimensioni della presentazione di un oggetto dalla cache senza prima dover spostare l'oggetto nello stato in esecuzione con una chiamata a IOleObject::GetExtent.

 

Documenti composti