Array
(
)

Comunicação entre dois programas

Rodc
   - 29 mar 2006

Preciso fazer dois programas (na mesma máquina) comunicarem-se. Preciso passar vários valores de um programa para outro. Se fosse apenas um valor eu usaria Mensagens do Windows, mas com vários valores não sei como.

Teria como o programa que vai receber os valores me passar o endereço de memória de uma função via mensagem do windows e eu usar um prototipo de função no endereço para retornar os valores? Mais ou menos como uma DLL faz?


Ipc$
   - 29 mar 2006

Pesquise por SendMessage e WM_CopyData


Michael
   - 29 mar 2006

Vc pode usar mensagens do Windows para passar vários valores de um programa para o outro, como uma estrutura complexa de um record, por exemplo.

[url=http://subsimple.com/delphi.asp]Neste site[/url] vc vai encontrar o componente InterAppComm, que permite enviar mensagens entre programas com extrema facilidade, inclusive records, como mencionei acima. Basicamente basta colocar um Sender em uma aplicação e um Receiver na outra, e controlar a comunicação através dos eventos publicados pelos controles.

Dependendo do seu caso, talvez uma mudança no código fonte do programa seja necessária para realizar envios assíncronos. Se não me falha a memória basta trocar a função da API utilizada.

Qualquer dúvida, poste aqui.

[]´s


Rodc
   - 29 mar 2006

Valeu pelas dicas. Estou pesquisando o WM_CopyData e parece que vai resolver meu problema.
Na verdade a ´outra aplicação´ não é minha, e não necessariamente vai ser em Delphi, eu só vou ter o Handle da aplicação para postar a mensagem.
Mas se tiverem mais sugestões, são bem vindas.


Ipc$
   - 29 mar 2006

Mas a outra aplicação deve estar preparada para receber a msg WM_CopyData.


Rodc
   - 29 mar 2006


Citação:
Mas a outra aplicação deve estar preparada para receber a msg WM_CopyData.

Sim, daí eu vou falar para quem quiser receber a informação do meu sistema criar uma aplicação que me passe o Handle dela e que receba a mensagem WM_CopyData.

Encontrei este site que explica bem fácil como implementar este procedimento: http://delphi.about.com/od/windowsshellapi/a/wm_copydata.htm


Rodc
   - 29 mar 2006

Só tem um problema ao usar o WM_COPYDATA, não posso usar o PostMessage e o SendMessage fica aguardando a aplicação de destino processar a mensagem.
Neste caso meu sistema pode travar caso a outra aplicação esteja travada ou demore para responder.
Será que não tem outra forma de passar um texto por mensagem sem ser usando o WM_COPYDATA?


Dopi
   - 29 mar 2006

Acho que as técnicas indicadas são de certa dificuldade para a maioria dos programadores...
Apenas comento isso, porque se vc pretende fazer um programa, para que ´terceiros´ interajam com ele... Use algo extremamente simples e acessível a diversas linguagens... como por exemplo:
- Troca de arquivos TXT (assim como é feito pelas Operadoras de Cartão de Crédito com o programa de T.E.F.)
- Sockets (TCP/IP)


Rodc
   - 29 mar 2006

Você tem razão.
É que os dois programas estarão rodando na mesma máquina e a troca de dados tem que ser bem rápida, a cada 300 milisegundos.
Mas estou pensando em abrir uma comunicação UDP em alguma porta da própria máquina.


Michael
   - 29 mar 2006


Citação:
Só tem um problema ao usar o WM_COPYDATA, não posso usar o PostMessage e o SendMessage fica aguardando a aplicação de destino processar a mensagem.
Neste caso meu sistema pode travar caso a outra aplicação esteja travada ou demore para responder.
Será que não tem outra forma de passar um texto por mensagem sem ser usando o WM_COPYDATA?


SendMessage é síncrono, ou seja, vai esperar uma resposta para permitir o fluxo do programa. PostMessage não é, mas vc disse que não pode usá-lo. Tente então a API SendMessageTimeout. Nela vc passa um parâmetro informando o tempo em que deve esperar por uma resposta para continuar, se a janela ´alvo´ não estiver na mesma thread que o seu programa.

[]´s