IDirectWriterLock - Implementazione di file composti
L'implementazione di file composta di IDirectWriterLock consente di aprire un file composto in modalità diretta con un singolo writer e più lettori.
I file composti possono essere aperti in modalità diretta usando il flag STGM_DIRECT. L'interfacciaIDirectWriterLock diimposta il STGM_READWRITE|STGM_SHARE_DENY_WRITE flag come valido in modalità diretta senza richiedere l'overhead di una copia snapshot.
Quando un file composto viene aperto in modalità transazionata usando il flag STGM_TRANSACTED, è anche possibile avere più lettori e un singolo writer usando il STGM_READWRITE |STGM_SHARE_DENY_WRITE flag. In questo caso, tuttavia, viene creata una copia snapshot del file per i lettori. Spesso si verifica un sovraccarico di una copia scratch.
Quando usare
Usare l'implementazione fornita dal sistema di IDirectWriterLock quando si apre una risorsa di archiviazione in modalità diretta (STGM_DIRECT) con il STGM_READWRITE |STGM_SHARE_DENY_WRITE flag.
Per ottenere un puntatore a IDirectWriterLock, chiamare QueryInterface su IStorage per ottenere l'oggetto di archiviazione radice per il file composto.
Chiamare IDirectWriterLock::WaitForWriteAccess per ottenere l'accesso in scrittura esclusivo a un file composto. Chiamare IDirectWriterLock::ReleaseWriteAccess per rilasciare l'accesso in scrittura esclusivo.
IDirectWriterLock::HaveWriteAccess indica se il file è attualmente bloccato.
Osservazioni
L'implementazione di file composta della funzionalità a scrittura singola e con più lettori è basata sul blocco dell'intervallo. Il writer ottiene l'accesso esclusivo alla risorsa di archiviazione da scrivere dopo che tutti i lettori correnti hanno chiuso lo spazio di archiviazione. Mentre il writer è attivo, i lettori successivi non possono aprire la risorsa di archiviazione. Il writer chiama IDirectWriterLock::WaitForWriteAccess per ottenere l'accesso in scrittura esclusivo. Il writer deve quindi chiamare IDirectWriterLock::ReleaseWriteAccess per rilasciare l'archiviazione.
La chiamata a IDirectWriterLock::WaitForWriteAccess è necessaria prima di scrivere in questa modalità con lettore singolo e con più writer. Tenta di scrivere nel file senza chiamare IDirectWriterLock::WaitForWriteAccess primo risultato in STG_E_ACCESSDENIED. Questo errore viene restituito anche se inizialmente il writer ha aperto il file e nessun lettore ha aperto il file.
Considerazioni sul marshalling
Il marshalling personalizzato viene in genere usato quando viene eseguito il marshalling di un file composto a un altro processo nello stesso computer. Quando si esegue il marshalling delle risorse di archiviazione, i diritti di accesso non vengono considerati e il puntatore IStorage viene passato al nuovo processo con le stesse modalità di accesso e gli stessi diritti del processo di marshalling originale. Per altre informazioni sulle modalità di accesso, vedere costanti STGM. Durante il marshalling, non vengono eseguiti blocchi o verificati per garantire l'accesso in scrittura esclusivo. In questo caso, non è prevista l'applicazione dei criteri a scrittura singolo per i file composti aperti nella modalità a scrittura singola e a più lettori. L'imposizione viene invece gestita internamente dall'implementazione del file composto.
Poiché il puntatoreIStorageviene passato a un altro processo durante il marshalling, è possibile che due processi abbiano accesso simultaneo allo stesso file composto. Anche se un chiamante può avere ottenuto l'accesso in scrittura esclusivo all'archiviazione chiamando IDirectWriterLock::WaitForWriteAccess, la versione con marshalling può anche avere accesso simultaneamente. Le versioni con marshalling non vengono forzate a chiudere mentre il singolo writer accede al file. In questo caso, l'implementazione del file composto sincronizza internamente le scritture.
Se un singolo writer ottiene l'accesso esclusivo chiamando, IDirectWriterLock::WaitForWriteAccess, l'archiviazione con marshalling dispone anche dell'accesso in scrittura e non deve chiamare IDirectWriterLock::WaitForWriteAccess. Entrambi i processi hanno accesso in scrittura e la sincronizzazione è controllata dall'implementazione interna del file composto.
Argomenti correlati