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 |
---|---|
|
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. |
|
Não utilizado. |
|
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.
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.
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 |