Buscar

Fazendo dois aplicativos se comunicarem - parte 1

nome

Diego De Queiroz Macedo

Colunista ainda sem descrição. Caro colunista, por favor envie-nos sua descrição.

Este artigo visa chamar atenção para as possibilidades que o sistema operacional Microsoft® Windows® proporciona.

Diversas vezes, enquanto lia tutoriais, apostilas e livros sobre técnicas de programação, via toda uma explicação sobre “Como fazer programas se comunicarem”, estes exibiam um ótimo conteúdo que explicava detalhadamente como implementar um Cliente / Servidor. Nada contra estes artigos, até digo que todos que já tive o prazer de ler eram muito bons, mas, quando queremos que dois aplicativos (que estão sendo executados ao mesmo tempo na mesma máquina) se comuniquem, temos caminhos mais ágeis e práticos. Um deles é o mesmo método com que o sistema operacional se comunica com o nosso aplicativo: o sistema de troca de mensagens.
Primeiramente, vamos entender como o sistema operacional (Windows, no nosso caso) funciona. Para isso, usaremos como exemplo o seguinte roteiro:

  1. Executo o Bloco de Notas;
  2. Executo o Word;
  3. Trago a janela do Bloco de Notas para frente (clicando no nome dela na barra de tarefas);
  4. Trago a janela do Word para frente;
  5. Fecho o Word;
  6. Digito a letra “A” no Bloco de Notas;

Para um usuário comum, tudo que eu acabei de descrever não passa de um simples conjunto de ações comuns, sem utilidade alguma, mas agora vamos estudar (mesmo que de um modo um pouco grosseiro, por assim dizer) o que realmente acontece, em nível de sistema operacional:

  1. Executo o Bloco de Notas:
    1. A janela é desenhada e exibida;
    2. O Bloco de Notas entra em loop esperando uma mensagem do sistema operacional.
  2. Executo o Word:
    1. A janela é desenhada e exibida;
    2. O Word entra em loop esperando uma mensagem do sistema operacional.
  3. Trago a janela do Bloco de Notas para frente:
    1. O sistema operacional envia a mensagem WM_ACTIVATE para a janela do Word pedindo que ela se desative;
    2. O sistema operacional envia a mensagem WM_ACTIVATE para a janela do Bloco de Notas pedindo para que ela se ative;
    3. O Word recebe a mensagem, a interpreta e executa o que foi solicitado;
    4. O Word entra novamente em loop esperando uma mensagem do sistema operacional;
    5. O Bloco de Notas recebe a mensagem, a interpreta e executa o que foi solicitado;
    6. O Bloco de Notas entra novamente em loop esperando uma mensagem do sistema operacional.
  4. Trago a janela do Word para frente:
    1. O sistema operacional envia a mensagem WM_ACTIVATE para a janela do Bloco de Notas pedindo que ela se desative;
    2. O sistema operacional envia a mensagem WM_ACTIVATE para a janela do Word pedindo para que ela se ative;
    3. O Bloco de Notas recebe a mensagem, a interpreta e executa o que foi solicitado;
    4. O Bloco de Notas entra novamente em loop esperando uma mensagem do sistema operacional;
    5. O Word recebe a mensagem, a interpreta e executa o que foi solicitado;
    6. O Word entra novamente em loop esperando uma mensagem do sistema operacional.
  5. Fecho o Word:
    1. O sistema operacional envia a mensagem WM_CLOSE para a janela do Word;
    2. O Word recebe a mensagem e a interpreta:
      1. Caso o documento atual tiver sido alterado, pergunta ao usuário se ele deseja salvar o documento antes de fechar, porém, como não é o nosso caso, nada acontece, pois o documento não foi alterado.
      2. O Word envia a mensagem WM_DESTROY a si mesmo;
    3. O Word recebe a mensagem e a interpreta:
      1. Libera toda memória alocada e destrói a janela;
      2. O Word envia a mensagem WM_QUIT a si mesmo;
      3. O Word recebe a mensagem, porém, dessa vez com um efeito especial: a mensagem WM_QUIT faz o loop do programa (que é um WHILE) receber o valor FALSE, logo, ele encontra sua situação de encerramento que é onde o programa é finalizado;
    4. O sistema operacional envia a mensagem WM_ACTIVATE para o Bloco de Notas, pedindo para que ele se ative;
    5. O Bloco de Notas recebe a mensagem e a interpreta;
  6. Digito a letra “A” no Bloco de Notas;
  7. O sistema operacional recebe a interrupção do teclado e envia a mensagem WM_KEYDOWN para o Bloco de Notas;
  8. O Bloco de Notas recebe a mensagem, a traduz (caractere “A”) e se auto-envia a mensagem WM_CHAR;
  9. A mensagem é novamente recebida e interpretada, desse modo, a letra “A” é escrita no seu devido lugar;

Um pouco maçante, eu sei, mas, como eu disse anteriormente, esta é só uma descrição “grosseira” do modo em que o sistema operacional gerencia seus processos. Na verdade, esse processo é finitamente (para não dizer infinitamente) mais complexo, pois mensagens são enviadas para todas as janelas a todo o momento, porém, a maioria delas o programa dá ao próprio sistema operacional o serviço de interpretá-las (utilizando um conjunto de ações padrões pré-definidas para mensagens específicas). Em outras palavras, é desse modo que você não precisa programar o que deve ser feito quando o usuário clicar no botão X no lado superior esquerdo do seu programa, ou no botão minimizar, por exemplo, pois todas as mensagens recebidas quando o usuário clica em um desses botões é enviada ao seu programa, que repassa para o sistema operacional, através de uma função chamada DefWindowProc (DEFault WINDOW PROCedure). Claro que grande parte dos programadores que lerem isso, até este ponto podem estar perdidos, pois apesar de já terem programado enormes Bancos de Dados, aplicações para Web, etc, nunca ouviram falar em nada do que foi tratado até este ponto. Isso se deve porque o Delphi emprega recursos nativos (a famosa VCL – Visual Component Library), que permitem um desenvolvimento mais complexo e ágil omitindo tais códigos. Mas isso tudo é assunto para um outro artigo.

Voltando ao enfoque principal, além das inúmeras mensagens que o Windows® emprega para seu próprio uso, ele permite que o usuário (nós programadores) defina até 31744 mensagens para uso particular! Isso mesmo: são exatamente 31744 mensagens que são raramente utilizadas!
Para enviar estas mensagens o Windows® possui uma constante global chamada WM_USER (que é equivalente ao valor hexadecimal 400), a partir deste valor podemos somar até 31743 (ou $7BFF) que compreende a extensão permitida pelo Windows®, de acordo com a tabela abaixo:

 Número   Intervalo (hexadecimal)   Função 
1 0 até WM_USER-1 Mensagens reservadas para uso do Windows®
2 WM_USER até $7FFF Mensagens inteiras reservadas para uso por classes privadas
3 $8000 até $BFFF Mensagens reservadas para uso futuro do Windows®
4 $C000 até $FFFF Mensagens de string para uso de aplicativos
5 Maior que $FFFF Mensagens reservadas para uso futuro do Windows®
Fonte: Win32 Developer’s Reference

Na próxima parte deste artigo codificarei um exemplo bem simples utilizando este sistema de mensagens.

Publicidade

Vote no artigo




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes do artigo

Categoria: Windows
Adicionado dia: 16/01/06
Por: Diego De Queiroz Macedo
Visualizado: 15287 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009