PROBLEMA: Sincronização OLE chamada falha no SendMessage entre-Process/thread

ID do artigo: 131056 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sintomas

Uma chamada OLE síncrona feita pelo destinatário de um inter-process/inter-thread SendMessage falha com RPC_E_CANTCALLOUT_ININPUTSYNCCALL(0x8001010D).

Causa

A causa é discutida detalhadamente na seção "Mais informações" deste artigo.

Resolução

Use PostMessage em vez de SendMessage um inter-process/inter-thread.

Situação

Esse comportamento é por design.

Mais Informações

Consulte o início do capítulo 13 no volume de referência o OLE 2 Programmer 1 para as categorias de chamadas OLE. A compreensão dessas categorias é necessária para este artigo.

A maioria das chamadas OLE são chamadas síncronas. Uma chamada síncrona para um processo diferente produz para esse processo e aguarda uma resposta de que o processo. Além disso, OLE tem chamadas sincronizados de entrada que se relacionam com as interfaces de ativação de locais. Chamadas sincronizados de entrada são implementadas usando um SendMessage inter-process/inter-thread.

Windows de 16 bits não permite que uma tarefa produzir enquanto estiver em um SendMessage inter-processo/inter-thread porque um deadlock do sistema pode ocorrer. O deadlock ocorre porque uma mensagem para o remetente pode estar presente na parte superior da fila de sistema compartilhado, e isso impede que outras tarefas, incluindo o destinatário de SendMessage, de recuperar suas mensagens da fila de sistema até que o remetente faz. O remetente não é possível recuperar a sua mensagem porque está aguardando o SendMessage inter-process/inter-thread retornar.

No Windows de 32 bits, cada processo possui sua própria fila de sistema e essa arquitetura normalmente impede que o problema de bloqueio ocorra. No entanto, quando um processo é locais ativo na janela do outro processo, as filas de sistema dos dois processos são sincronizadas como no windows de 16 bits, portanto, o deadlock pode ocorrer. Para evitar isso, o OLE pára chamadas síncronas OLE do que está sendo feitas enquanto o chamador é o destinatário de uma chamada sincronizados de entrada.

OLE determina se o chamador da chamada síncrona é um destinatário de uma chamada sincronizados de entrada usando a API InSendMessage(). Essa verificação ampla impede que uma chamada síncrona de sendo feitas se o chamador é atualmente um destinatário de qualquer SendMessage inter-process/inter-thread.

Propriedades

ID do artigo: 131056 - Última revisão: segunda-feira, 11 de julho de 2005 - Revisão: 2.2
A informação contida neste artigo aplica-se a:
  • Microsoft Platform Software Development Kit-January 2000 Edition nas seguintes plataformas
    • Microsoft Windows NT Server 3.5
    • Microsoft Windows NT Server 4.0 Standard Edition
    • Microsoft Windows NT Workstation 3.5
    • Microsoft Windows NT Workstation 4.0 Developer Edition
    • Microsoft Windows 95
    • the operating system: Microsoft Windows 2000
Palavras-chave: 
kbmt kbprb KB131056 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 131056

Submeter comentários