IDirectWriterLock — реализация составного файла
Реализация составного файла IDirectWriterLock позволяет открыть составной файл в прямом режиме с одним модулем записи и несколькими средствами чтения.
Составные файлы можно открывать в прямом режиме с помощью флага STGM_DIRECT. Интерфейс IDirectWriterLock задает STGM_READWRITE| STGM_SHARE_DENY_WRITE флаг как допустимый в режиме прямого подключения, не требуя дополнительных расходов на копию snapshot.
При открытии составного файла в режиме транзакций с помощью флага STGM_TRANSACTED можно также использовать несколько модулей чтения и один модуль записи с помощью STGM_READWRITE| флаг STGM_SHARE_DENY_WRITE. Однако в этом случае для читателей создается snapshot копия файла. Часто возникает накладная нагрузка на копию с нуля.
Назначение
Используйте предоставленную системой реализацию IDirectWriterLock при открытии хранилища в режиме прямого подключения (STGM_DIRECT) с STGM_READWRITE| STGM_SHARE_DENY_WRITE флагов.
Чтобы получить указатель на IDirectWriterLock, вызовите QueryInterface в IStorage , чтобы получить корневой объект хранилища для составного файла.
Вызовите метод IDirectWriterLock::WaitForWriteAccess , чтобы получить монопольный доступ на запись в составной файл. Вызовите метод IDirectWriterLock::ReleaseWriteAccess , чтобы освободить монопольный доступ на запись.
IDirectWriterLock::HaveWriteAccess указывает, заблокирован ли файл в данный момент.
Комментарии
Реализация составного файла функции с одним модулем записи с несколькими модулями чтения основана на блокировке диапазона. Модуль записи получает монопольный доступ к хранилищу для записи после закрытия хранилища всеми текущими средствами чтения. Пока модуль записи активен, последующие средства чтения не могут открыть хранилище. Модуль записи вызывает IDirectWriterLock::WaitForWriteAccess для получения монопольного доступа на запись. Затем модуль записи должен вызвать IDirectWriterLock::ReleaseWriteAccess , чтобы освободить хранилище.
Вызов IDirectWriterLock::WaitForWriteAccess требуется перед записью в этом режиме с одним модулем чтения с несколькими модулями записи. Попытки записи в файл без вызова IDirectWriterLock::WaitForWriteAccess сначала приводят к STG_E_ACCESSDENIED. Эта ошибка возвращается, даже если модуль записи изначально открыл файл и в настоящее время файл не открыт.
Рекомендации по маршалингу
Настраиваемая маршалинг обычно используется, когда составной файл маршалируется в другой процесс на том же компьютере. При маршалинге хранилищ права доступа не учитываются, и указатель IStorage передается новому процессу с теми же режимами доступа и правами, что и исходный процесс маршалинга. Дополнительные сведения о режимах доступа см. в разделе Константы STGM. Во время маршалинга блокировки не принимаются и не проверяются для обеспечения монопольного доступа на запись. В этом случае не применяется политика с одним модулем записи для составных файлов, открытых в режиме с одним модулем записи с несколькими модулями чтения. Вместо этого принудительное применение обрабатывается внутренне реализацией составного файла.
Так как указатель IStorage передается другому процессу во время маршалинга, два процесса могут иметь одновременный доступ к одному составному файлу. Несмотря на то, что вызывающий объект мог получить монопольный доступ на запись к хранилищу, вызвав IDirectWriterLock::WaitForWriteAccess, маршалированная версия также может иметь доступ одновременно. Маршалированные версии не принудительно закрываются, пока один модуль записи обращается к файлу. В этом случае реализация составного файла синхронизирует записи внутри системы.
Если один модуль записи получает монопольный доступ путем вызова IDirectWriterLock::WaitForWriteAccess, маршалированное хранилище также имеет доступ на запись и не требует вызова IDirectWriterLock::WaitForWriteAccess. Оба процесса имеют доступ на запись, а синхронизация управляется внутренней реализацией составного файла.
Связанные темы