Что означает код HRESULT 0x00040180 (OLEOBJ_S_INVALIDVERB)?

 
Предыдущий Следующий
CACHE_S_SOMECACHES_NOTUPDATED OLEOBJ_S_CANNOT_DOVERB_NOW

OLEOBJ_S_INVALIDVERB

OLE object отклонил недействительный verb без общей ошибки

это HRESULT 262528 (0x00040180) из winerror.h. AllStat описывает OLEOBJ_S_INVALIDVERB как «Недействительный verb для OLE object». Старший бит severity сброшен, поэтому это успешный результат, но он сообщает больше, чем обычный S_OK.

Запрошенный номер OLE verb недействителен для объекта; вызывающий код должен выбрать поддерживаемый verb, а не считать всю активацию неработоспособной.

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

  • Этот HRESULT может возвращаться из IOleObject::DoVerb; фиксируйте интерфейс и метод, вернувшие результат, а не делайте вывод только по символическому имени.
  • Этот HRESULT может возникать в меню контейнера, сформированном из verb объекта; фиксируйте интерфейс и метод, вернувшие результат, а не делайте вывод только по символическому имени.
  • Этот HRESULT может возникать в коде автоматизации, вызывающем primary, show, open, hide или пользовательские verbs; фиксируйте интерфейс и метод, вернувшие результат, а не делайте вывод только по символическому имени.

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

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

  • Для этого результата, зафиксируйте исходный HRESULT 0x00040180 сразу после возврата из метода и запишите, использовал ли вызывающий код SUCCEEDED, FAILED, проверку на точное равенство или преобразование в исключение.
  • Определите точного владельца OLEOBJ_S_INVALIDVERB: интерфейс, метод, экземпляр объекта, версию поставщика или фильтра, поток или apartment и фазу операции.
  • Проверьте решающую границу контракта для этого результата: идентификатор verb присутствует в регистрации объекта или результате EnumVerbs для текущего класса и состояния объекта.
  • Проверьте каждый выходной параметр, счётчик, массив статусов, возвращённый интерфейс и побочный эффект, который документация метода связывает с этим результатом «успех с дополнительной информацией».
  • Сравните наблюдаемое состояние до и после этого результата; не предполагайте, что признак успешной severity означает завершение каждой необязательной подоперации.
  • Для этого результата, воспроизведите минимальный запрос с тем же состоянием объекта, а перед повтором измените только условие, подтверждённое собранными данными.

Граница состояния, которую нужно подтвердить

Главный вопрос для этого результата — присутствует ли идентификатор verb в регистрации объекта или результате EnumVerbs для текущего класса и состояния. для этого результата сам HRESULT не подтверждает завершение несвязанной работы и не гарантирует качество необязательных выходных данных.

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

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

Обновите список поддерживаемых verbs и вызовите допустимую альтернативу. Не повторяйте один и тот же недействительный verb и не отменяйте регистрацию класса только из-за этого статуса.

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

Какие доказательства и телеметрию сохранить

  • Сохраните значение запрошенного verb.
  • Сохраните CLSID и версию сервера.
  • Сохраните перечисленные записи OLEVERB.
  • Сохраните сведения о состояниях running и in-place active объекта.
  • Сохраните сведения об окне контейнера и client site.

Также зафиксируйте oleobj_s_invalidverb_operation, oleobj_s_invalidverb_object, oleobj_s_invalidverb_state_before, oleobj_s_invalidverb_state_after, время UTC, идентификаторы процесса и потока, а также correlation ID. для этого результата, не записывайте секреты в журналы, но сохраните GUID, CLSID, подтипы media, идентификаторы свойств, идентификаторы строк и хеши, необходимые для различения объектов.

Отличие от соседних значений HRESULT

OLEOBJ_S_CANNOT_DOVERB_NOW означает, что verb допустим, но временно недоступен; OLEOBJ_S_INVALIDVERB означает, что не принимается сам идентификатор.

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

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

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

Отчёт в поддержку для этого результата должен включать десятичное значение 262528, шестнадцатеричное 0x00040180, описание AllStat, API-владельца и первый детальный статус или выходной параметр, объясняющий, почему метод не вернул обычный S_OK.

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

Панель инструментов кэширует пользовательский verb из старой версии сервера. После обновления verb отсутствует, поэтому контейнер получает OLEOBJ_S_INVALIDVERB, перестраивает меню из EnumVerbs и использует primary verb.

Негативный тест должен сохранять условие, приводящее к этому HRESULT; тест восстановления должен менять только это условие и проверять как конечное состояние, так и HRESULT.

Ссылки


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