| Предыдущий | Следующий |
| CACHE_E_NOCACHE_UPDATED | OLEOBJ_E_INVALIDVERB |
OLEOBJ_E_NOVERBS
У OLE-объекта нет доступных verbs
OLEOBJ_E_NOVERBS имеет шестнадцатеричное значение 0x80040180 (беззнаковое 2147746176, знаковое -2147221120). AllStat описывает его как «у OLE-объекта нет verbs». Узкий смысл: OLE-объект не предоставляет команд, доступных контейнеру. Сбойный этап — перечисление команд или выбор действия активации по умолчанию для встроенного объекта.
Старший бит 0x80040180 установлен, поэтому это ошибка, а не успешный или информационный результат. Поле facility равно 4 (FACILITY_ITF), а младший 16-битный код равен 384 (0x0180). Эти битовые поля классифицируют значение, но сами по себе не определяют сбойный объект; по-прежнему необходимы нативный метод, идентичность объекта и первый источник этого HRESULT .
Этап API
Чтобы правильно понять этот HRESULT, нужен контекст подсистемы: OLE verbs — команды, которые сам объект объявляет доступными. Для этого результата контейнер должен строить интерфейс по текущему перечислению и состоянию объекта, а не предполагать, что стандартно выглядящие команды существуют у каждого встроенного класса.
- Связывайте этот результат с одной конкретной операцией в IOleObject::EnumVerbs, IOleObject::DoVerb, меню контейнера, состоянии объекта и доступности verb.
- Убедитесь, что этот HRESULT вернулся из перечисления команд или выбора действия активации по умолчанию для встроенного объекта, а не из последующей очистки или обёртки.
- Сохраните IErrorInfo, нижележащий Win32-результат, сообщение поставщика или сбой обратного вызова, предшествовавший этому HRESULT; HRESULT не должен стирать более конкретную причину.
Шаги проверки
- Зафиксируйте этот HRESULT на первом нативном возврате до преобразования обёрткой в общее исключение.
- Определите точный объект, метод и фазу жизненного цикла, связанные с перечислением команд или выбором действия активации по умолчанию для встроенного объекта.
- Вызовите EnumVerbs и сохраните его точный результат.
- Зафиксируйте CLSID объекта, версию сервера и признак доступности кэшированных данных для отображения.
- Не выводите набор verbs из другой версии или файловых ассоциаций.
- Воспроизведите этот результат с одним контролируемым изменением входа или состояния и убедитесь, что исправление меняет решающие диагностические данные, а не только скрывает результат.
Границы интерпретации
- Этот результат может возникнуть, если объект предназначен только для данных и намеренно не имеет интерактивных verbs.
- Этот результат может возникнуть, если регистрация или реализация сервера не содержит определений verbs.
- Этот результат может возникнуть, если контейнер предполагает, что каждый встроенный класс поддерживает open, show, edit или primary activation.
Запись инцидента
Для полезного расследования зафиксируйте ID verb, перечисленные OLEVERB, CLSID объекта, состояние активации, client site, родительский HWND, указатель MSG, прямоугольник и ответ сервера. Для этого результата также сохраните версии приложения и компонента, архитектуру, ID процесса и потока, COM apartment, идентификатор корреляции операции, длительность и первое событие, изменившее состояние до сбоя. При журналировании этого результата скрывайте содержимое и учётные данные, сохраняя типы, длины, хэши, непрозрачные идентификаторы и поколения жизненного цикла, необходимые для воспроизведения контракта.
- Для этого результата вызовите EnumVerbs и сохраните его точный результат.
- Для этого результата зафиксируйте CLSID объекта, версию сервера и признак доступности кэшированных данных для отображения.
- Для этого результата не выводите набор verbs из другой версии или файловых ассоциаций.
Условия восстановления
Исправление. Для этого результата показывайте объект как неинтерактивный, используйте команду, специфичную для класса, либо исправляйте сервер только если его контракт требует verbs. Граница повтора. Повторяйте только после замены объекта или исправления сервера; повторное перечисление того же неизменённого объекта не создаст verbs. Перед повтором операции восстановите меню контейнера и состояние active object, закройте частично активированный интерфейс и заново перечислите verbs после изменения объекта или сервера.
Практический сценарий
Отчёт содержит статический объект данных с корректным представлением, но без редактора; контейнер отображает его и отключает команду Edit. Это локализует результат в области OLE verbs и активации встроенных объектов и даёт регрессионный тест для указанного исправления.
Отличие от связанных HRESULT
OLEOBJ_E_INVALIDVERB означает, что verbs существуют, но выбранный недопустим; OLEOBJ_E_NOVERBS означает отсутствие доступных verbs. Для этого результата сохраняйте эти исходы раздельно в сопоставлении исключений, измерениях телеметрии, сообщениях пользователю и автоматической политике повторов.
Рекомендации разработчикам и администраторам
Для этого результата стройте команды по текущему перечислению OLEVERB, сохраняйте знаковые идентификаторы verb и передавайте в DoVerb правильные client site, родительское окно, сообщение и прямоугольник. Регрессионные проверки для этого результата должны включать объекты без verbs, отрицательные стандартные verbs, private verbs, доступность в зависимости от состояния, headless-активацию, перезапуск сервера и деактивацию UI после сбоя.
Эксплуатационное исправление для этого результата должно быть направлено на владельца, подтверждённого данными: прежде чем исправлять регистрацию, убедитесь, что ожидаемый object server установлен и тот же CLSID предоставляет verb в другом поддерживаемом контейнере. Сохраните трассировки до и после для этого результата, чтобы изменение можно было объяснить и откатить.
Ссылки
- Microsoft: общие коды ошибок COM — официальная документация Microsoft, относящаяся к этому результату.
- Microsoft: значения HRESULT — официальная документация Microsoft, относящаяся к этому результату.
- Microsoft: IOleObject::EnumVerbs — официальная документация Microsoft, относящаяся к этому результату.
- Microsoft: IOleObject::DoVerb — официальная документация Microsoft, относящаяся к этому результату.
- Microsoft: структура OLEVERB — официальная документация Microsoft, относящаяся к этому результату.
Нужно найти другой код? Найти другой код состояния или ошибки.