Partager via


IDirectWriterLock - Implémentation de fichier composé

L’implémentation de fichier composé de 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 de 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ée du fichier est effectuée pour les lecteurs. Il y a souvent une surcharge d’une copie à zéro.

Quand utiliser

Utilisez l’implémentation fournie par le système de 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é.

Remarques

L’implémentation de fichier composé de la fonctionnalité à enregistreur unique, à plusieurs lecteurs, 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. Pendant que l’enregistreur est 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 en mode multi-lecteur, multiple-writer. Tente d’écrire dans le fichier sans appeler IDirectWriterLock ::WaitForWriteAccess 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é sur 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 pointeurIStorageest 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 multi-writer. 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 un accès simultané au même fichier composé. Même si un appelant a peut-être 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 de 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 une synchronisation sont contrôlés par l’implémentation de fichier composé interne.

IDirectWriterLock