IDirectWriterLock - Implémentation de fichier composé

L’implémentation de fichier composé d’IDirectWriterLock permet d’ouvrir un fichier composé en mode direct avec un seul enregistreur et plusieurs lecteurs.

Les fichiers composés peuvent être ouverts en mode direct à l’aide de l’indicateur STGM_DIRECT. L’interface IDirectWriterLock définit la STGM_READWRITE| STGM_SHARE_DENY_WRITE indicateur comme valide en mode direct sans nécessiter la surcharge d’une copie d’instantané.

Lorsqu’un fichier composé est ouvert en mode transactionné à l’aide de l’indicateur STGM_TRANSACTED, vous pouvez également avoir plusieurs lecteurs et un seul enregistreur à l’aide du STGM_READWRITE| indicateur STGM_SHARE_DENY_WRITE. Toutefois, dans ce cas, une copie instantanée du fichier est effectuée pour les lecteurs. Il y a souvent une surcharge d’une copie de zéro.

Quand utiliser

Utilisez l’implémentation fournie par le système d’IDirectWriterLock lorsque vous ouvrez un stockage en mode direct (STGM_DIRECT) avec le STGM_READWRITE| STGM_SHARE_DENY_WRITE indicateurs.

Pour obtenir un pointeur vers IDirectWriterLock, appelez QueryInterface sur IStorage pour obtenir l’objet de stockage racine du fichier composé.

Appelez IDirectWriterLock::WaitForWriteAccess pour obtenir un accès en écriture exclusif à un fichier composé. Appelez IDirectWriterLock::ReleaseWriteAccess pour libérer un accès en écriture exclusif.

IDirectWriterLock::HaveWriteAccess indique si le fichier est actuellement verrouillé.

Notes

L’implémentation de fichier composé de la fonctionnalité mono-writer, multi-lecteur est basée sur le verrouillage de plage. L’enregistreur obtient un accès exclusif au stockage pour écrire une fois que tous les lecteurs actuels ont fermé le stockage. Bien que l’enregistreur soit actif, les lecteurs suivants ne peuvent pas ouvrir le stockage. L’enregistreur appelle IDirectWriterLock::WaitForWriteAccess pour obtenir un accès en écriture exclusif. L’enregistreur doit ensuite appeler IDirectWriterLock::ReleaseWriteAccess pour libérer le stockage.

L’appel à IDirectWriterLock::WaitForWriteAccess est requis avant d’écrire dans ce mode de lecture unique, multiple-writer. Tente d’écrire dans le fichier sans appeler IDirectWriterLock::WaitForWriteAccess en premier résultat dans STG_E_ACCESSDENIED. Cette erreur est retournée même si l’enregistreur a ouvert le fichier initialement, et aucun lecteur n’a actuellement le fichier ouvert.

Considérations relatives au marshaling

Le marshaling personnalisé est généralement utilisé lorsqu’un fichier composé est marshalé vers un autre processus sur le même ordinateur. Lors du marshaling des stockages, les droits d’accès ne sont pas pris en compte et le pointeur IStorage est passé au nouveau processus avec les mêmes modes d’accès et droits que le processus de marshaling d’origine. Pour plus d’informations sur les modes d’accès, consultez Constantes STGM. Pendant le marshaling, aucun verrou n’est pris ou vérifié pour garantir un accès en écriture exclusif. Dans ce cas, il n’existe aucune application de la stratégie d’enregistreur unique pour les fichiers composés ouverts en mode multiscripteur unique. Au lieu de cela, l’application est gérée en interne par l’implémentation de fichier composé.

Étant donné que le pointeur IStorage est passé à un autre processus lors du marshaling, il est possible que deux processus aient accès simultanément au même fichier composé. Même si un appelant peut avoir obtenu un accès en écriture exclusif au stockage en appelant IDirectWriterLock::WaitForWriteAccess, la version marshalée peut également avoir accès simultanément. Les versions marshalées ne sont pas forcées de se fermer pendant que l’enregistreur unique accède au fichier. Dans ce cas, l’implémentation du fichier composé synchronise les écritures en interne.

Si un seul enregistreur obtient un accès exclusif en appelant, IDirectWriterLock::WaitForWriteAccess, le stockage marshalé dispose également d’un accès en écriture et n’a pas à appeler IDirectWriterLock::WaitForWriteAccess. Les deux processus disposent d’un accès en écriture et d’une synchronisation sont contrôlés par l’implémentation de fichier composé interne.

IDirectWriterLock