IDirectWriterLock — реализация составного файла

Реализация составного файла IDirectWriterLock позволяет открыть составной файл в прямом режиме с одним модулем записи и несколькими модулями чтения.

Составные файлы можно открывать в прямом режиме с помощью флага STGM_DIRECT. Интерфейс IDirectWriterLock задает STGM_READWRITE| STGM_SHARE_DENY_WRITE флаг как допустимый в прямом режиме, не требуя дополнительных затрат на копирование моментального снимка.

При открытии составного файла в режиме транзакций с помощью флага STGM_TRANSACTED можно также иметь несколько модулей чтения и одного модуля записи с помощью STGM_READWRITE| флаг STGM_SHARE_DENY_WRITE. Однако в этом случае для читателей создается копия моментального снимка файла. Часто возникает накладная нагрузка на копию с нуля.

Назначение

Используйте предоставленную системой реализацию IDirectWriterLock при открытии хранилища в прямом режиме (STGM_DIRECT) с STGM_READWRITE| STGM_SHARE_DENY_WRITE флаги.

Чтобы получить указатель на IDirectWriterLock, вызовите QueryInterface в IStorage , чтобы получить корневой объект хранилища для составного файла.

Вызовите IDirectWriterLock::WaitForWriteAccess, чтобы получить монопольный доступ на запись к составным файлам. Вызовите IDirectWriterLock::ReleaseWriteAccess, чтобы освободить монопольный доступ на запись.

IDirectWriterLock::HaveWriteAccess указывает, заблокирован ли файл.

Remarks

Составная реализация одного модуля записи с несколькими модулями чтения основана на блокировке диапазона. Модуль записи получает монопольный доступ к хранилищу для записи после закрытия хранилища всеми текущими средствами чтения. Хотя модуль записи активен, последующие читатели не могут открыть хранилище. Модуль записи вызывает IDirectWriterLock::WaitForWriteAccess для получения монопольного доступа на запись. Затем модуль записи должен вызвать IDirectWriterLock::ReleaseWriteAccess , чтобы освободить хранилище.

Вызов IDirectWriterLock::WaitForWriteAccess требуется перед записью в этом режиме с одним модулем чтения с несколькими модулями записи. Попытки записи в файл без вызова IDirectWriterLock::WaitForWriteAccess сначала приводят к STG_E_ACCESSDENIED. Эта ошибка возвращается, даже если модуль записи изначально открыл файл, и средства чтения в настоящее время не открывают файл.

Рекомендации по маршалингу

Настраиваемое маршалинг обычно используется, когда составной файл маршалируется в другой процесс на том же компьютере. При маршалинге хранилищ права доступа не учитываются, а указатель IStorage передается в новый процесс с теми же режимами доступа и правами, что и исходный процесс маршалинга. Дополнительные сведения о режимах доступа см. в разделе констант STGM. Во время маршалинга блокировки не принимаются или проверяются, чтобы обеспечить монопольный доступ на запись. В этом случае политика одного модуля записи для составных файлов, открытых в режиме с одним модулем записи и несколькими модулями чтения, не применяется. Вместо этого принудительное применение обрабатывается внутренне реализацией составного файла.

Так как указатель IStorage передается другому процессу во время маршалинга, два процесса могут иметь одновременный доступ к одному составному файлу. Несмотря на то, что вызывающий объект мог получить монопольный доступ на запись к хранилищу путем вызова IDirectWriterLock::WaitForWriteAccess, маршалированная версия также может иметь доступ одновременно. Маршалированные версии не принудительно закрываются, пока один модуль записи обращается к файлу. В этом случае реализация составного файла синхронизирует операции записи внутри системы.

Если один модуль записи получает монопольный доступ путем вызова , IDirectWriterLock::WaitForWriteAccess, маршалированные хранилища также имеют доступ на запись и не должны вызывать IDirectWriterLock::WaitForWriteAccess. Оба процесса имеют доступ на запись и синхронизацию управляются внутренней реализацией составного файла.

IDirectWriterLock