Что означает код HRESULT 0x80030020 (STG_E_SHAREVIOLATION)?

 
Предыдущий Следующий
STG_E_READFAULT STG_E_LOCKVIOLATION

STG_E_SHAREVIOLATION

Конфликт совместного доступа, а не обязательно повреждение

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

Structured Storage применяет более строгие правила, чем ожидают многие вызывающие стороны. Microsoft указывает, что потоки составного файла, открываемые через IStorage::OpenStream, должны использовать STGM_SHARE_EXCLUSIVE. Поэтому обходной путь с несколькими независимыми дескрипторами может усилить конфликт, а не устранить его.

Как устранить фактический конфликт

  • Определите процесс и операцию, уже владеющие документом; отличайте интерактивное редактирование от кратковременного сканера или фонового рабочего процесса.
  • Проверьте флаги STGM_*, используемые всеми компонентами при открытии корневого хранилища и дочерних потоков.
  • Сериализуйте запись через одного владельца; если требуется параллельное чтение, используйте документированный процесс копии или снимка.
  • Повторяйте операцию только после освобождения файла владельцем. Частый слепой цикл повторов может поддерживать высокую конкуренцию.

Ссылки


Нужно найти другой код? Найти другой код состояния или ошибки.