IDirectWriterLock - Implémentation de fichiers composés

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 le STGM_READWRITE| STGM_SHARE_DENY_WRITE indicateur comme valide en mode direct sans nécessiter la surcharge d’une copie de instantané.

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

Quand l’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 l’accès en écriture exclusif.

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

Notes

L’implémentation de fichiers composés de la fonctionnalité multilecteur unique 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. Tant que l’enregistreur est actif, les lecteurs suivants ne peuvent pas ouvrir le stockage. Le rédacteur 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 à lecture unique et à écriture multiple. Les tentatives d’écriture dans le fichier sans appeler IDirectWriterLock::WaitForWriteAccess aboutissent d’abord à STG_E_ACCESSDENIED. Cette erreur est retournée même si l’enregistreur a ouvert le fichier initialement et qu’aucun lecteur n’a actuellement ouvert le fichier.

Considérations relatives au marshaling

Le marshaling personnalisé est généralement utilisé lorsqu’un fichier composé est marshalé sur un autre processus sur la même machine. 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’y a pas d’application de la stratégie d’écriture unique pour les fichiers composés ouverts en mode multilecteur unique. Au lieu de cela, l’application est gérée en interne par l’implémentation de fichiers composés.

Étant donné que le pointeur IStorage est passé à un autre processus pendant le marshaling, il est possible pour deux processus d’avoir un accès simultané 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 tant 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 besoin d’appeler IDirectWriterLock::WaitForWriteAccess. Les deux processus ont un accès en écriture et la synchronisation est contrôlée par l’implémentation de fichier composé interne.

IDirectWriterLock