| Предыдущий | Следующий |
| STG_E_READFAULT | STG_E_LOCKVIOLATION |
STG_E_SHAREVIOLATION
Конфликт совместного доступа, а не обязательно повреждение
STG_E_SHAREVIOLATION означает, что запрошенный доступ несовместим с уже открытым тем же хранилищем или файлом. Это часто происходит, когда документ открыт в другом приложении, удерживается фоновым средством предварительного просмотра или индексатором, всё ещё обрабатывается серверным процессом либо два компонента одного процесса открывают его с несовместимыми режимами совместного доступа.
Structured Storage применяет более строгие правила, чем ожидают многие вызывающие стороны. Microsoft указывает, что потоки составного файла, открываемые через IStorage::OpenStream, должны использовать STGM_SHARE_EXCLUSIVE. Поэтому обходной путь с несколькими независимыми дескрипторами может усилить конфликт, а не устранить его.
Как устранить фактический конфликт
- Определите процесс и операцию, уже владеющие документом; отличайте интерактивное редактирование от кратковременного сканера или фонового рабочего процесса.
- Проверьте флаги
STGM_*, используемые всеми компонентами при открытии корневого хранилища и дочерних потоков. - Сериализуйте запись через одного владельца; если требуется параллельное чтение, используйте документированный процесс копии или снимка.
- Повторяйте операцию только после освобождения файла владельцем. Частый слепой цикл повторов может поддерживать высокую конкуренцию.
Ссылки
- Microsoft: правила совместного доступа IStorage::OpenStream
- Microsoft: IStorage::OpenStorage
- Apache POI: составные документы OLE 2
Нужно найти другой код? Найти другой код состояния или ошибки.