| Предыдущий | Следующий |
| OLEOBJ_E_NOVERBS | INPLACE_E_NOTUNDOABLE |
OLEOBJ_E_INVALIDVERB
Недопустимый verb для OLE-объекта
Когда Windows возвращает OLEOBJ_E_INVALIDVERB— HRESULT 2147746177, 0x80040181, со знаковым значением -2147221119, — AllStat описывает состояние как «недопустимый verb для OLE-объекта». Практический смысл: запрошенный OLE verb не поддерживается данным объектом или его текущим состоянием. Окружающая операция — вызов IOleObject::DoVerb из меню, по двойному щелчку или программной командой активации.
Старший бит 0x80040181 установлен, поэтому это ошибка, а не успешный или информационный результат. Поле facility равно 4 (FACILITY_ITF), а младший 16-битный код — 385 (0x0181). Эти битовые поля классифицируют значение, но сами по себе не определяют сбойный объект; по-прежнему необходимы нативный метод, идентичность объекта и первый источник этого HRESULT .
Точная точка сбоя
Чтобы правильно понять этот HRESULT, нужен контекст подсистемы: OLE verbs — команды, которые сам объект объявляет доступными. Для этого результата контейнер должен строить интерфейс по текущему перечислению и состоянию объекта, а не предполагать, что стандартно выглядящие команды существуют у каждого встроенного класса.
- Связывайте этот результат с одной конкретной операцией в IOleObject::EnumVerbs, IOleObject::DoVerb, меню контейнера, состоянии объекта и доступности verb.
- Убедитесь, что этот HRESULT вернулся непосредственно из вызова IOleObject::DoVerb из меню, двойного щелчка или программной команды активации, а не из последующей очистки или обёртки.
- Сохраните IErrorInfo, нижележащий Win32-результат, сообщение поставщика или сбой обратного вызова, предшествовавший этому HRESULT; HRESULT не должен стирать более конкретную причину.
Диагностические данные
Для полезного расследования зафиксируйте ID verb, перечисленные OLEVERB, CLSID объекта, состояние активации, client site, родительский HWND, указатель MSG, прямоугольник и ответ сервера. Для этого результата также сохраните версии приложения и компонента, архитектуру, ID процесса и потока, COM apartment, идентификатор корреляции операции, длительность и первое событие, изменившее состояние до сбоя. При журналировании этого результата скрывайте содержимое и учётные данные, сохраняя типы, длины, хэши, непрозрачные идентификаторы и поколения жизненного цикла, необходимые для воспроизведения контракта.
- Для этого результата запишите lVerb и полный текущий результат EnumVerbs.
- Для этого результата зафиксируйте CLSID объекта, misc status, состояние активации и источник пользовательской команды.
- Для этого результата отдельно проверьте основной/default verb и class-specific положительные ID.
Путь исправления
- Зафиксируйте этот HRESULT на первом нативном возврате до преобразования обёрткой в общее исключение.
- Определите точный объект, метод и фазу жизненного цикла при вызове IOleObject::DoVerb из меню, двойного щелчка или программной команды активации.
- Запишите lVerb и полный текущий результат EnumVerbs.
- Зафиксируйте CLSID объекта, misc status, состояние активации и источник пользовательской команды.
- Отдельно проверьте основной/default verb и class-specific положительные ID.
- Воспроизведите этот результат с одним контролируемым изменением входа или состояния и убедитесь, что исправление меняет решающие диагностические данные, а не только скрывает результат.
Различные причины
- Этот результат может возникнуть, если значение lVerb не было возвращено EnumVerbs и не является поддерживаемым стандартным verb.
- Этот результат может возникнуть, если сохранённый или кэшированный ID verb относится к другому классу или версии.
- Этот результат может возникнуть, если verb недоступен в текущем состоянии активации объекта или в режиме только чтения.
Политика повтора
Исправление. Для этого результата выберите verb, который объект объявляет доступным сейчас, либо отключите недоступную команду. Граница повтора. Повторяйте после обновления списка verbs или изменения состояния объекта; перебор произвольных целых значений не является безопасным способом обнаружения. Перед повтором операции восстановите меню контейнера и состояние active object, закройте частично активированный интерфейс и заново перечислите verbs после изменения объекта или сервера.
Практический сценарий
Контейнер кэширует verb 2 из одной версии сервера электронных таблиц, но обновлённый сервер объявляет другие положительные ID; перестроение меню из EnumVerbs исправляет активацию. Это локализует результат в области OLE verbs и активации встроенных объектов и даёт регрессионный тест для указанного исправления.
Отличие от связанных HRESULT
OLEOBJ_E_NOVERBS означает отсутствие команд в перечислении; OLEOBJ_E_INVALIDVERB отвергает одну выбранную команду. Для этого результата сохраняйте эти исходы раздельно в сопоставлении исключений, измерениях телеметрии, сообщениях пользователю и автоматической политике повторов.
Рекомендации разработчикам и администраторам
Для этого результата стройте команды по текущему перечислению 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, относящаяся к этому результату.
Нужно найти другой код? Найти другой код состояния или ошибки.
