Funzionamento dell'associazione asincrona e dell'archiviazione
L'archiviazione asincrona migliora la specifica di archiviazione strutturata COM per supportare il download di oggetti di archiviazione in reti a latenza elevata e a collegamento lento, ad esempio Internet. L'archiviazione asincrona funziona insieme ai moniker asincroni per fornire un comportamento di associazione asincrono completo.
Oggetto documento incorporato in una pagina Web
Quando un utente fa clic su un collegamento che rappresenta un documento incorporato in una pagina Web, si verificano gli eventi seguenti:
Il browser chiama la funzione MkParseDisplayName , passando l'URL del collegamento.
MkParseDisplayName analizza l'URL, crea un moniker asincrono corrispondente e restituisce un puntatore all'interfaccia IMoniker del moniker .
Il browser chiama IsAsyncMoniker per determinare se il moniker è asincrono, crea un contesto di associazione, registra l'interfaccia IBindStatusCallback con il contesto di associazione, solo se il moniker è asincrono e chiama IMoniker::BindToObject, passando il contesto di associazione.
Il moniker viene associato all'oggetto ed esegue una query per l'interfaccia IPersistMoniker , che indica se l'oggetto supporta l'associazione asincrona e l'archiviazione. Se l'oggetto restituisce un puntatore a IPersistMoniker:
- Il moniker URL chiama IPersistMoniker::Load, passando il proprio puntatore IMoniker all'oggetto.
- L'oggetto modifica il contesto di associazione, sceglie se vuole una risorsa di archiviazione bloccante o non bloccante, registra il proprio IBindStatusCallback e chiama IMoniker::BindToStorage sul puntatore ricevuto tramite IPersistMoniker::Load.
- Il moniker crea un archivio asincrono, mantiene un riferimento all'interfaccia IFillLockBytes dell'oggetto wrapper, registra l'interfaccia IProgressNotify nell'archiviazione radice e chiama IPersistStorage::Load, passando il puntatore IStorage dell'archiviazione asincrona. Quando arrivano i dati (su un thread in background) il moniker chiama IFillLockBytes per riempire ILockBytes nel file temporaneo.
- L'oggetto legge i dati dall'archiviazione e restituisce da IPersistMoniker::Load quando ha ricevuto dati sufficienti per considerarsi inizializzati. Se l'oggetto tenta di leggere i dati che non sono ancora stati scaricati, il downloader riceve una notifica su IProgressNotify. All'interno del metodo IProgressNotify::OnProgress , il thread di download si blocca in un ciclo di messaggi modali o fa sì che l'archiviazione asincrona restituisca E_PENDING, a seconda che l'oggetto abbia richiesto un blocco o un'archiviazione non bloccante.
Se l'oggetto non implementa IPersistMoniker, il moniker esegue una query per IPersistStorage, che indica che lo stato persistente dell'oggetto viene archiviato in un oggetto di archiviazione. Se l'oggetto restituisce un puntatore a IPersistStorage:
- Il moniker chiama IMoniker::BindToStorage su se stesso, richiedendo un IStorage di blocco (poiché l'oggetto non è compatibile con asincrona), crea un archivio asincrono, mantiene un riferimento all'interfaccia IFillLockBytes dell'oggetto wrapper, registra l'interfaccia IProgressNotify nell'archiviazione radice e chiama IPersistStorage::Load, passando il puntatore IStorage dell'archiviazione asincrona. Quando arrivano i dati (su un thread in background) il moniker chiama IFillLockBytes per riempire ILockBytes nel file temporaneo.
- L'oggetto legge i dati dall'archiviazione e restituisce da IPersistStorage::Load quando ha ricevuto dati sufficienti per considerarsi inizializzati. Se l'oggetto tenta di leggere i dati non ancora scaricati, riceve una notifica su IProgressNotify. All'interno del metodo IProgressNotify::OnProgress , il thread di download si blocca sempre in un ciclo di messaggi modali.
Indipendentemente dal fatto che il download sia sincrono o asincrono, il moniker restituisce da IMoniker::BindToObject e il browser riceve l'oggetto inizializzato richiesto.
Il browser esegue una query per IOleObject e ospita l'oggetto come oggetto Document. A questo punto l'oggetto potrebbe non essere inizializzato completamente, ma sufficiente per visualizzare qualcosa di utile, nel qual caso il download continua in background.