Что означает код HRESULT 0x80040008 (OLE_E_CLASSDIFF)?

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

OLE_E_CLASSDIFF

Класс источника связанного OLE object изменился

это HRESULT 2147745800 (0x80040008) из winerror.h. AllStat описывает его как «Класс источника связанного объекта изменился». Результат относится к binding или обновлению связанного объекта относительно его текущего источника. Эта константа полезен только вместе с методом и фазой жизненного цикла, где источник теперь сообщает класс, отличный от сохранённого в метаданных link.

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

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

  • Этот 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, поставщика и базовый ресурс, проверяя несовпадение текущего класса источника с классом из метаданных link.

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

Непосредственная граница контракта конкретна: источник сообщает класс, отличный от сохранённого в метаданных link. Типичные ветви причин:

  • Файл источника заменён документом другого типа.
  • Ассоциация файлов или преобразование изменили класс источника.
  • Метаданные link устарели или повреждены.

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

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

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

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

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

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

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

Для этого результата, основное восстановление — подтвердить новую идентичность источника и либо с согласия пользователя создать link заново, либо восстановить ожидаемый исходный файл. Отчёт о OLE_E_CLASSDIFF должен показывать достаточно состояния binding или обновления связанного объекта по текущему источнику, чтобы понять расхождение классов без отладчика в production.

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

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

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

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

OLE_E_CANT_BINDTOSOURCE означает сбой самого binding; этот HRESULT означает, что binding нашёл источник, но его класс больше не совпадает. Тесты и телеметрия должны сохранять это различие для этого результата.

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

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

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

Ссылки


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