| Предыдущий | Следующий |
| OLEOBJ_S_INVALIDVERB | OLEOBJ_S_INVALIDHWND |
OLEOBJ_S_CANNOT_DOVERB_NOW
Допустимый OLE verb нельзя выполнить в текущем состоянии
это HRESULT 262529 (0x00040181) из winerror.h. AllStat описывает OLEOBJ_S_CANNOT_DOVERB_NOW как «номер verb допустим, но сейчас выполнить verb нельзя». Старший бит severity сброшен, поэтому это успешный результат, однако он несёт больше информации, чем обычный S_OK.
Номер verb допустим для OLE-объекта, но объект сейчас не может выполнить его из-за состояния активации, владения UI или другого временного условия.
Где встречается этот результат
- Этот HRESULT может появляться в IOleObject::DoVerb при in-place activation; сохраняйте интерфейс и метод-источник, а не делайте вывод только по символическому имени.
- Этот HRESULT может появляться в контейнерах при переключении между open и in-place состояниями; сохраняйте интерфейс и метод-источник.
- Этот HRESULT может появляться у объектов, чей сервер занят или не готов к запрошенному UI-действию; сохраняйте интерфейс и метод-источник.
Для этого результата, одно и то же числовое успешное значение может быть обработано неверно, если обёртка оставляет только Boolean. для этого результата сохраняйте исходный HRESULT до оценки выходных данных и перехода состояния, относящихся к конкретному коду.
Граница состояния, которую нужно подтвердить
Главный вопрос для этого результата — поддерживает ли класс объекта этот verb и может ли последующий переход состояния сделать его исполнимым. для этого результата сам HRESULT не подтверждает завершение несвязанной работы и не гарантирует качество необязательных выходных данных.
Надёжная Интерпретация этого результата точно указывает контракт метода, поколение объекта и выходные данные, которые остаются действительными. для этого результата, это не позволяет ошибочно считать результат «успех с дополнительной информацией» ни полным успехом, ни обычной ошибкой.
Какие доказательства и телеметрию сохранить
- Сохраните значение verb и флаги OLEVERB.
- Сохраните состояние объекта до вызова.
- Сохраните активный объект и сведения о владельце UI-окна.
- Сохраните сведения об отзывчивости серверного процесса.
- Сохраните предыдущие вызовы активации и деактивации.
Также зафиксируйте oleobj_s_cannot_doverb_now_operation, oleobj_s_cannot_doverb_now_object, oleobj_s_cannot_doverb_now_state_before, oleobj_s_cannot_doverb_now_state_after, время UTC, идентификаторы процесса и потока, а также correlation ID. для этого результата, не записывайте секреты в журналы, но сохраните GUID, CLSID, подтипы media, идентификаторы свойств, идентификаторы строк и хеши, необходимые для различения объектов.
Правильная обработка, повтор и восстановление
Восстановите совместимое состояние объекта и контейнера, затем повторяйте вызов только если действие пользователя всё ещё актуально. Не запускайте частые циклические повторы: этот статус описывает состояние, а не сам по себе временный обрыв транспорта.
Повторяйте OLEOBJ_S_CANNOT_DOVERB_NOW только когда зафиксированное состояние действительно может изменить документированный результат. для этого результата, повтор того же вызова неуместен для устойчивого признака конца, отмены, неподдерживаемого формата, скорректированного свойства или частичного результата, уже выполненные побочные эффекты которого ещё не согласованы.
Последовательность диагностики
- Для этого результата, зафиксируйте исходный HRESULT
0x00040181сразу после возврата из метода и запишите, использовал ли вызывающий кодSUCCEEDED,FAILED, проверку на точное равенство или преобразование в исключение. - Определите точного владельца
OLEOBJ_S_CANNOT_DOVERB_NOW: интерфейс, метод, экземпляр объекта, версию поставщика или фильтра, поток или apartment и фазу операции. - Проверьте решающую границу контракта для этого результата: класс объекта поддерживает этот verb, а последующий переход состояния может сделать его исполнимым.
- Проверьте каждый выходной параметр, счётчик, массив статусов, возвращённый интерфейс и побочный эффект, который документация метода связывает с этим результатом «успех с дополнительной информацией».
- Сравните наблюдаемое состояние до и после этого результата; не предполагайте, что признак успешной severity означает завершение каждой необязательной подоперации.
- Для этого результата, воспроизведите минимальный запрос с тем же состоянием объекта, а перед повтором измените только условие, подтверждённое собранными данными.
Практический сценарий проверки
Документ запрашивает verb Open, когда объект ещё завершает in-place-деактивацию. Код ждёт её окончания, повторно проверяет client site и один раз вызывает тот же поддерживаемый verb.
Негативный тест должен сохранять условие, приводящее к этому HRESULT; тест восстановления должен менять только это условие и проверять как конечное состояние, так и HRESULT.
Отличие от соседних значений HRESULT
OLEOBJ_S_INVALIDVERB отклоняет само определение verb; OLEOBJ_S_CANNOT_DOVERB_NOW принимает verb, но не разрешает выполнять его в текущий момент.
Для этого результата, это различие определяет, должен ли вызывающий код принять частичные результаты, завершить перечисление, подождать, изменить конфигурацию, уведомить пользователя либо вообще не выполнять восстановление после ошибки.
Рекомендации разработчикам и администраторам
Когда OLEOBJ_S_CANNOT_DOVERB_NOW передаётся через границы процессов, RPC, скриптов или управляемого кода, сохраняйте беззнаковое 32-битное значение и символическое имя. для этого результата, знаковое десятичное представление может скрыть, что бит severity указывает успех, и привести к неверной обработке исключений или повторов.
Отчёт в поддержку для этого результата должен включать десятичное значение 262529, шестнадцатеричное 0x00040181, описание AllStat, API-владельца и первый детальный статус или выходной параметр, объясняющий, почему метод не вернул обычный S_OK.
Ссылки
- Microsoft: коды состояния COM OLE object — официальная документация, относящаяся к этому HRESULT.
- Microsoft: IOleObject::DoVerb — официальная документация, относящаяся к этому HRESULT.
- Microsoft: in-place-активация — официальная документация, относящаяся к этому HRESULT.
Нужно найти другой код? Найти другой код состояния или ошибки.
