Compartilhar via


Método IMessageFilter::MessagePending (objidl.h)

Indica que uma mensagem chegou enquanto COM está esperando para responder a uma chamada remota.

Lidar com a entrada enquanto aguarda a conclusão de uma chamada de saída pode introduzir complicações. O aplicativo deve determinar se deseja processar a mensagem sem interromper a chamada, continuar aguardando ou cancelar a operação.

Sintaxe

DWORD MessagePending(
  [in] HTASK htaskCallee,
  [in] DWORD dwTickCount,
  [in] DWORD dwPendingType
);

Parâmetros

[in] htaskCallee

A ID do thread do aplicativo chamado.

[in] dwTickCount

O número de tiques desde que a chamada foi feita. Ele é calculado com base na função GetTickCount .

[in] dwPendingType

O tipo de chamada feita durante a qual uma mensagem ou evento foi recebido. Os valores possíveis são da enumeração PENDINGTYPE, em que PENDINGTYPE_TOPLEVEL significa que a chamada de saída não foi aninhada dentro de uma chamada de outro aplicativo e PENDINTGYPE_NESTED significa que a chamada de saída foi aninhada dentro de uma chamada de outro aplicativo.

Retornar valor

Esse método pode retornar os valores a seguir.

Código de retorno Descrição
PENDINGMSG_CANCELCALL
Cancele a chamada de saída. Isso deve ser retornado somente em condições extremas. Cancelar uma chamada que não respondeu ou foi rejeitada pode criar transações órfãs e perder recursos. COM falha na chamada original e retorna RPC_E_CALL_CANCELLED.
PENDINGMSG_WAITNOPROCESS
Não utilizado.
PENDINGMSG_WAITDEFPROCESS
As mensagens de teclado e mouse não são mais expedidas. No entanto, há alguns casos em que mensagens de mouse e teclado podem causar deadlock no sistema e, nesses casos, mensagens de mouse e teclado são descartadas. WM_PAINT mensagens são enviadas. As mensagens de alternância de tarefas e ativação são tratadas como antes.

Comentários

O COM chama MessagePending depois que um aplicativo faz uma chamada de método COM e uma mensagem do Windows ocorre antes que a chamada seja retornada. Uma mensagem do Windows é enviada, por exemplo, quando o usuário seleciona um comando de menu ou clica duas vezes em um objeto. Antes de COM fazer a chamada MessagePending , ele calcula o tempo decorrido desde que a chamada de método COM original foi feita. COM fornece o tempo decorrido no parâmetro dwTickCount . Enquanto isso, COM não remove a mensagem da fila.

As mensagens do Windows que aparecem na fila do chamador devem permanecer na fila até que o tempo suficiente tenha passado para garantir que as mensagens provavelmente não sejam o resultado da digitação antecipada, mas sim uma tentativa de chamar a atenção. Defina o atraso com o parâmetro dwTickCount — recomenda-se um atraso de dois ou três segundos. Se esse período de tempo passar e a chamada não tiver sido concluída, o chamador deverá liberar as mensagens da fila e a caixa de diálogo OLE UI ocupado deverá ser exibida oferecendo ao usuário a opção de repetir a chamada (continuar aguardando) ou alternar para a tarefa especificada. Isso garante os seguintes comportamentos:

  • Se as chamadas forem concluídas em um período razoável, o tipo com antecedência será tratado corretamente.
  • Se o receptor não responder, digite antecipadamente não será interpretado incorretamente e o usuário poderá agir para resolver o problema. Por exemplo, os servidores OLE 1 podem enfileirar solicitações sem responder quando estão em caixas de diálogo modais.
Lidar com a entrada enquanto aguarda a conclusão de uma chamada de saída pode introduzir complicações. O aplicativo deve determinar se deseja processar a mensagem sem interromper a chamada, continuar aguardando ou cancelar a operação.

Quando não há resposta para a chamada COM original, o aplicativo pode cancelar a chamada e restaurar o objeto COM para um estado consistente chamando IStorage::Revert em seu armazenamento. O objeto pode ser liberado quando o contêiner pode ser desligado. No entanto, cancelar uma chamada pode criar operações órfãs e vazamentos de recursos. O cancelamento deve ser usado apenas como último recurso. É altamente recomendável que os aplicativos não permitam que essas chamadas sejam canceladas.

Nota Embora o parâmetro htaskCallee seja digitado como um HTASK, ele contém a ID de thread do thread chamado. Ao implementar a interface IMessageFilter , você pode chamar a função OpenThread para obter o identificador de thread do parâmetro htaskCallee e pode chamar a função GetProcessIdOfThread para obter a ID do processo.
 

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 2000 Professional [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows 2000 Server [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho objidl.h

Confira também

Imessagefilter

Oleuibusy