Что означает код HRESULT 0x8001000A (RPC_E_CANTTRANSMIT_CALL)?

 
Предыдущий Следующий
RPC_E_INVALID_DATAPACKET RPC_E_CLIENT_CANTMARSHAL_DATA

RPC_E_CANTTRANSMIT_CALL

Что означает RPC_E_CANTTRANSMIT_CALL

RPC_E_CANTTRANSMIT_CALL — HRESULT, относящийся к области COM/RPC. COM не смогла передать вызов, поскольку очередь сообщений оставалась переполненной даже после уступки времени выполнения.

Применительно к RPC_E_CANTTRANSMIT_CALL код относится к COM/RPC и описывает передачу вызова, маршалинг параметров, состояние прокси либо исключение на стороне клиента или сервера.

Практический вывод для RPC_E_CANTTRANSMIT_CALL: этот HRESULT фиксирует описанное условие, но сам по себе не показывает, какой участник операции первым нарушил контракт. Для RPC_E_CANTTRANSMIT_CALL найдите первый вызов, вернувший статус, и только после этого меняйте конфигурацию подсистемы COM/RPC.

Как читать имя RPC_E_CANTTRANSMIT_CALL

Имя RPC_E_CANTTRANSMIT_CALL помогает сузить поиск: CANTTRANSMIT — технический маркер «canttransmit»; CALL — вызов API. Эти части имени не заменяют документацию API, но позволяют проверить, что журнал и код относятся к одному и тому же условию.

Особенность RPC_E_CANTTRANSMIT_CALL

Частая причина — STA-поток, который занят длительным синхронным обработчиком и не dispatch-ит сообщения COM. Проверьте UI handlers, рекурсивные вызовы и всплески запросов: сервер или apartment не успевает освобождать очередь, поэтому новые calls не передаются.

Разбор условия ошибки

Применительно к RPC_E_CANTTRANSMIT_CALL важно сохранить исходный контекст вызова: имя функции, параметры, состояние объекта и первый низкоуровневый статус. В случае RPC_E_CANTTRANSMIT_CALL без этого одинаковый HRESULT может ошибочно связываться с разными причинами.

  • При разборе RPC_E_CANTTRANSMIT_CALL после разрыва соединения или отключения объекта создайте новый COM-прокси, а не повторяйте вызов через старый.
  • При разборе RPC_E_CANTTRANSMIT_CALL запишите CLSID/IID, номер метода, границу процесса или апартамента и сторону, на которой получен HRESULT.
  • При разборе RPC_E_CANTTRANSMIT_CALL проверьте регистрацию интерфейса и proxy/stub, разрядность компонентов и совместимость type library.
  • При разборе RPC_E_CANTTRANSMIT_CALL сверьте типы, размеры и время жизни всех входных/выходных параметров, особенно указателей и пользовательских структур.

Как воспроизвести проблему

  • Для RPC_E_CANTTRANSMIT_CALL проверьте тот же метод in-proc или с минимальными параметрами, чтобы локализовать маршалинг.
  • Для RPC_E_CANTTRANSMIT_CALL соберите дампы клиента и сервера вокруг первого сбоя и сохраните correlation между вызовами.
  • Для RPC_E_CANTTRANSMIT_CALL включите журналирование RPC/COM только на время воспроизведения и зафиксируйте идентификатор интерфейса.

Проверка после изменения

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

Ссылки по RPC_E_CANTTRANSMIT_CALL


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