Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os aplicativos COM devem ser capazes de lidar corretamente com a entrada do usuário durante o processamento de uma ou mais chamadas do COM ou do sistema operacional. A COM fornece sincronização de chamadas apenas para apartamentos de thread único. Apartamentos multithreaded (contendo threads free-threaded) não recebem chamadas ao fazer chamadas (no mesmo thread). Os apartamentos multithreaded não podem fazer chamadas sincronizadas de entrada. As chamadas assíncronas são convertidas em chamadas síncronas em apartamentos multithreaded. O filtro de mensagens não é chamado para qualquer thread em um apartamento multithreaded. Para obter mais informações sobre problemas de threading, consulte Processos, threads e apartamentos.
As chamadas COM entre processos dividem-se em três categorias, como se segue:
-
Chamadas síncronas
-
A maior parte da comunicação que ocorre dentro da COM é síncrona. Ao fazer chamadas síncronas, o chamador aguarda a resposta antes de continuar e pode receber mensagens recebidas enquanto espera. COM entra em um loop modal para aguardar a resposta, recebendo e despachando outras mensagens de forma controlada.
-
Notificações assíncronas
-
Ao enviar notificações assíncronas, o chamador não espera pela resposta. A COM usa PostMessage ou eventos de alto nível para enviar notificações assíncronas, dependendo da plataforma. COM define cinco métodos assíncronos de IAdviseSink:
Observação
Enquanto o COM está processando uma chamada assíncrona, chamadas síncronas não podem ser feitas. Por exemplo, a implementação de um aplicativo contêiner de OnDataChange não pode conter uma chamada para IPersistStorage::Save. Essas chamadas são as únicas chamadas assíncronas suportadas pelo COM. Não há nenhuma maneira de criar uma interface personalizada que é assíncrona no momento.
-
Chamadas sincronizadas de entrada
-
Ao fazer chamadas sincronizadas de entrada, o objeto chamado deve concluir a chamada antes de produzir controle. Isso ajuda a garantir que o gerenciamento de foco funcione corretamente e que os dados inseridos pelo usuário sejam processados adequadamente. Estas chamadas são feitas pela COM através da função SendMessage, sem entrar num loop modal. Durante o processamento de uma chamada sincronizada de entrada, o objeto chamado não deve chamar nenhuma função ou método (incluindo métodos síncronos) que possa gerar controle. Os seguintes métodos são sincronizados de entrada:
- IOleWindow::GetWindow
- IOleInPlaceActiveObject::OnFrameWindowActivate
- IOleInPlaceActiveObject::OnDocWindowActivate
- IOleInPlaceActiveObject::ResizeBorder
- IOleInPlaceUIWindow::GetBorder
- IOleInPlaceUIWindow::RequestBorderSpace
- IOleInPlaceUIWindow::SetBorderSpace
- IOleInPlaceFrame::SetMenu
- IOleInPlaceFrame::SetStatusText
- IOleInPlaceObject::SetObjectRects
Para minimizar os problemas que podem surgir do processamento assíncrono de mensagens, a maioria das chamadas do método COM são síncronas. Com a comunicação síncrona, não há necessidade de código especial para enviar e lidar com mensagens recebidas. Quando um aplicativo faz uma chamada de método síncrono, o COM entra em um loop de espera modal que lida com as respostas necessárias e envia mensagens de entrada para aplicativos capazes de processá-las.
COM gerencia chamadas de método atribuindo um identificador chamado ID de thread lógico . Um novo é atribuído quando um usuário seleciona um comando de menu ou quando o aplicativo inicia uma nova operação COM. As chamadas subsequentes relacionadas à chamada COM inicial recebem o mesmo ID de thread lógico que a chamada inicial.