Что означает код HRESULT 0x80040002 (OLE_E_ENUM_NOMORE)?

 
Также может означать:
КонстантаТипОС
TAPI_E_NOITEMSHRESULTWindows
Предыдущий Следующий
TAPI_E_NOTENOUGHMEMORY TAPI_E_NOITEMS

OLE_E_ENUM_NOMORE

OLE enumerator не может продолжить из-за отсутствующих базовых данных

это HRESULT 2147745794 (0x80040002) из winerror.h. AllStat описывает его как «Невозможно продолжить перечисление: связанные данные отсутствуют». Результат относится к перечислению OLE verbs, advise connections или связанных данных объекта. Эта константа полезен только вместе с методом и фазой жизненного цикла, где у enumerator нет пригодных связанных данных для выдачи следующего элемента.

Решающее значение OLE_E_ENUM_NOMORE состоит в том, что у enumerator нет пригодных связанных данных, из которых можно получить следующий элемент. для этого результата, бит severity сам по себе не определяет обработку; решающий факт — у enumerator отсутствуют пригодные связанные данные для следующего элемента. Надёжная диагностика этого результата сохраняет исходное значение и восстанавливает состояние, при котором это стало истинно.

Где появляется результат

  • Этот HRESULT может возникать в контейнерах compound document, встроенных и связанных объектах, при OLE-активации, advising, кэшировании, преобразовании и сохранении.
  • Привяжите сбой к одной конкретной операции среди IOleObject, IOleLink, IOleCache, IAdviseSink, IPersistStorage, IOleInPlaceObject, moniker, verb и callback client site.
  • Сохраните CLSID, идентичность объекта и client site, storage или moniker, cookie advise, verb, состояние активации, поколение окна и формат представления до освобождения или замены объекта, вернувшего этот HRESULT.

Запись об инциденте для этого результата должна различать вызывающий код, runtime, поставщика и базовый ресурс, проверяя отсутствие пригодных связанных данных у enumerator.

Типичные причины и граница интерпретации

Непосредственная граница контракта конкретна: у enumerator нет пригодных связанных данных для выдачи следующего элемента. Типичные ветви причин:

  • Объект удалил коллекцию во время активного перечисления.
  • Enumerator пережил своего владельца.
  • Базовые данные presentation или link не были инициализированы.

Подтвердите ветвь причины, объясняющую отсутствие пригодных связанных данных, используя аргументы вызова, состояние объекта, метаданные, сведения об устройстве или трассировки поставщика.

Данные и телеметрия

  • Запишите этот HRESULT, 0x80040002, имя native-метода, ID процесса и потока, ID операции, сборку компонента, архитектуру и затраченное время.
  • Сохраните поколение объекта, идентичность link или storage, состояние активации, cookie advise, срок жизни окна и формат представления.
  • Сохраните IErrorInfo, расширенный статус поставщика, событие storage или устройства и первый нижележащий сбой, предшествовавший этому HRESULT.
  • Записывайте временные метки и ID операций для этого результата, чтобы callbacks можно было расположить по времени относительно неудачного перечисления OLE verbs, advise connections или связанных данных объекта.
  • При обработке этого HRESULT, выполняйте unadvise только для активных cookies, освобождайте интерфейсы сервера и site в документированном порядке и сохраняйте storage, если пользователь отменил действие или состояние результата неясно.

Телеметрия для этого результата должна сохранять структурные факты, доказывающие отсутствие пригодных связанных данных у enumerator, исключая содержимое, учётные данные, байты firmware, ключи CSS и персональные данные.

Последовательность диагностики

  • Зафиксируйте этот HRESULT на native-границе до того, как framework преобразует его в общее исключение.
  • Определите точное поколение объекта и метод среди IOleObject, IOleLink, IOleCache, IAdviseSink, IPersistStorage, IOleInPlaceObject, moniker, verb и callbacks client site.
  • Докажите решающее условие: у enumerator нет пригодных связанных данных для выдачи следующего элемента.
  • Проверяйте вероятные причины независимо: объект удалил коллекцию во время перечисления; enumerator пережил владельца; базовые presentation/link-данные не были инициализированы.
  • Перед очисткой после этого результата, классифицируйте каждый выходной результат как действительный, неизменённый, частичный или с переданным владением.
  • Для этого результата, меняйте по одному кандидату причины — состояние коллекции, срок жизни владельца или инициализацию базовых данных — и воспроизводите на минимальном стенде.

Правильная обработка и восстановление

Для этого результата, основное восстановление — заново получить enumerator из текущего состояния объекта и отличать документированное нормальное завершение от отсутствия базовых данных. Отчёт о OLE_E_ENUM_NOMORE должен показывать достаточно состояния перечисления OLE verbs, advise connections или связанных данных объекта, чтобы понять отсутствие базовых данных без отладчика в production.

Компонент, ответственный за этот результат, должен определить идемпотентность, отмену, лимит попыток и согласование для неудачного перечисления. Перед повтором OLE_E_ENUM_NOMORE.

Практический сценарий

Advise-enumerator переживает shutdown объекта и завершается сбоем, поскольку владелец уже освободил таблицу connections. Зафиксируйте решающее состояние для этого результата и проверьте восстановление на новом поколении объекта или запроса.

Отличие от связанных HRESULT

S_FALSE часто обозначает нормальный конец COM-перечисления; этот HRESULT сообщает о сбое из-за недоступности связанных данных. Тесты и телеметрия должны сохранять это различие для этого результата.

Рекомендации разработчикам и администраторам

Разработчикам, обрабатывающим OLE_E_ENUM_NOMORE следует явно управлять временем жизни объекта и переходами состояния, сохранять native HRESULT и обеспечивать безопасную очистку при частичной инициализации или частичных выходных данных. Создайте небольшой стенд container/server, покрывающий состояния loaded, running, in-place active, UI-active, static, linked и shutdown.

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

Ссылки


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