| Предыдущий | Следующий |
| CACHE_S_SOMECACHES_NOTUPDATED | OLEOBJ_S_CANNOT_DOVERB_NOW |
OLEOBJ_S_INVALIDVERB
OLE object отклонил недействительный verb без общей ошибки
OLEOBJ_S_INVALIDVERB — это HRESULT 262528 (0x00040180) из winerror.h. AllStat описывает OLEOBJ_S_INVALIDVERB как «Недействительный verb для OLE object». Старший бит severity сброшен, поэтому это успешный результат, но он сообщает больше, чем обычный S_OK.
Запрошенный номер OLE verb недействителен для объекта; вызывающий код должен выбрать поддерживаемый verb, а не считать всю активацию неработоспособной.
Где встречается этот результат
OLEOBJ_S_INVALIDVERBможет возвращаться из IOleObject::DoVerb; фиксируйте интерфейс и метод, вернувшие результат, а не делайте вывод только по символическому имени.OLEOBJ_S_INVALIDVERBможет возникать в меню контейнера, сформированном из verb объекта; фиксируйте интерфейс и метод, вернувшие результат, а не делайте вывод только по символическому имени.OLEOBJ_S_INVALIDVERBможет возникать в коде автоматизации, вызывающем primary, show, open, hide или пользовательские verbs; фиксируйте интерфейс и метод, вернувшие результат, а не делайте вывод только по символическому имени.
Для OLEOBJ_S_INVALIDVERB, одно и то же числовое успешное значение может быть обработано неверно, если обёртка оставляет только Boolean. Для OLEOBJ_S_INVALIDVERBсохраняйте исходный HRESULT до оценки выходных данных и перехода состояния, относящихся к конкретному коду.
Последовательность диагностики
- Для
OLEOBJ_S_INVALIDVERB, зафиксируйте исходный HRESULT0x00040180сразу после возврата из метода и запишите, использовал ли вызывающий кодSUCCEEDED,FAILED, проверку на точное равенство или преобразование в исключение. - Определите точного владельца
OLEOBJ_S_INVALIDVERB: интерфейс, метод, экземпляр объекта, версию поставщика или фильтра, поток или apartment и фазу операции. - Проверьте решающую границу контракта для
OLEOBJ_S_INVALIDVERB: идентификатор verb присутствует в регистрации объекта или результате EnumVerbs для текущего класса и состояния объекта. - Для
OLEOBJ_S_INVALIDVERB, проверьте каждый выходной параметр, счётчик, массив статусов, возвращённый интерфейс и побочный эффект, который документация метода связывает с этим результатом «успех с дополнительной информацией». - Сравните наблюдаемое состояние до и после
OLEOBJ_S_INVALIDVERB; не предполагайте, что признак успешной severity означает завершение каждой необязательной подоперации. - Для
OLEOBJ_S_INVALIDVERB, воспроизведите минимальный запрос с тем же состоянием объекта, а перед повтором измените только условие, подтверждённое собранными данными.
Граница состояния, которую нужно подтвердить
Главный вопрос для OLEOBJ_S_INVALIDVERB — присутствует ли идентификатор verb в регистрации объекта или результате EnumVerbs для текущего класса и состояния. Для OLEOBJ_S_INVALIDVERBсам HRESULT не подтверждает завершение несвязанной работы и не гарантирует качество необязательных выходных данных.
Надёжная интерпретация OLEOBJ_S_INVALIDVERB точно указывает контракт метода, поколение объекта и выходные данные, которые остаются действительными. Для OLEOBJ_S_INVALIDVERB, это не позволяет ошибочно считать результат «успех с дополнительной информацией» ни полным успехом, ни обычной ошибкой.
Правильная обработка, повтор и восстановление
Обновите список поддерживаемых verbs и вызовите допустимую альтернативу. Не повторяйте один и тот же недействительный verb и не отменяйте регистрацию класса только из-за этого статуса.
Повторяйте OLEOBJ_S_INVALIDVERB только когда зафиксированное состояние действительно может изменить документированный результат. Для OLEOBJ_S_INVALIDVERB, повтор того же вызова неуместен для устойчивого признака конца, отмены, неподдерживаемого формата, скорректированного свойства или частичного результата, уже выполненные побочные эффекты которого ещё не согласованы.
Какие доказательства и телеметрию сохранить
- Для
OLEOBJ_S_INVALIDVERB, сохраните значение запрошенного verb. - Для
OLEOBJ_S_INVALIDVERB, сохраните CLSID и версию сервера. - Для
OLEOBJ_S_INVALIDVERB, сохраните перечисленные записи OLEVERB. - Для
OLEOBJ_S_INVALIDVERB, сохраните сведения о состояниях running и in-place active объекта. - Для
OLEOBJ_S_INVALIDVERB, сохраните сведения об окне контейнера и client site.
Также зафиксируйте oleobj_s_invalidverb_operation, oleobj_s_invalidverb_object, oleobj_s_invalidverb_state_before, oleobj_s_invalidverb_state_after, время UTC, идентификаторы процесса и потока, а также correlation ID. Для OLEOBJ_S_INVALIDVERB, не записывайте секреты в журналы, но сохраните GUID, CLSID, подтипы media, идентификаторы свойств, идентификаторы строк и хеши, необходимые для различения объектов.
Отличие от соседних значений HRESULT
OLEOBJ_S_CANNOT_DOVERB_NOW означает, что verb допустим, но временно недоступен; OLEOBJ_S_INVALIDVERB означает, что не принимается сам идентификатор.
Для OLEOBJ_S_INVALIDVERB, это различие определяет, должен ли вызывающий код принять частичные результаты, завершить перечисление, подождать, изменить конфигурацию, уведомить пользователя либо вообще не выполнять восстановление после ошибки.
Рекомендации разработчикам и администраторам
Для OLEOBJ_S_INVALIDVERB, телеметрия приложения должна различать окончательный сбой, обычный успех, частичное завершение, продолжение, отмену и успешный результат с предупреждением. Для OLEOBJ_S_INVALIDVERB, пакет данных для поддержки должен содержать минимальный воспроизводимый вызов и фактическую конфигурацию, которую видел компонент-владелец.
Отчёт в поддержку для OLEOBJ_S_INVALIDVERB должен включать десятичное значение 262528, шестнадцатеричное 0x00040180, описание AllStat, API-владельца и первый детальный статус или выходной параметр, объясняющий, почему метод не вернул обычный S_OK.
Практический сценарий проверки
Панель инструментов кэширует пользовательский verb из старой версии сервера. После обновления verb отсутствует, поэтому контейнер получает OLEOBJ_S_INVALIDVERB, перестраивает меню из EnumVerbs и использует primary verb.
Негативный тест должен сохранять условие, приводящее к OLEOBJ_S_INVALIDVERB; тест восстановления должен менять только это условие и проверять как конечное состояние, так и HRESULT.
Ссылки
- Microsoft: коды состояния COM OLE object — официальная документация, относящаяся к
OLEOBJ_S_INVALIDVERB. - Microsoft: IOleObject::DoVerb — официальная документация, относящаяся к
OLEOBJ_S_INVALIDVERB. - Microsoft: IOleObject::EnumVerbs — официальная документация, относящаяся к
OLEOBJ_S_INVALIDVERB.
Нужно найти другой код? Найти другой код состояния или ошибки.