Newsgroup: it.comp.lang.delphi
Titolo: Piccolo problema: trasmettere informazioni tra applicazioni

Salve, avrei bisogno di un suggerimento per risolvere un problema: ho due
applicazioni distinte (chiamiamole A e B), e avrei bisogno che a un certo
punto A dicesse a B "ci sono informazioni". B a questo punto dovrebbe andare
a leggersele e dire ad A "le ho lette". In pratica uno scambio di dati tra
applicazioni.
Il problema e' che vorrei che tale scambio fosse semplice e che non usasse
DDE, COM, OLE o file temporanei per lo scambio dati. Sarebbe bello se si
potesse mandare un messaggio con l'indirizzo del buffer dei dati, ma non
posso, da una applicazione, accedere alla memoria di un'altra
applicazione...
C'e' qualche sistema per poterlo fare in modo pulito?
Grazie
Daigo
--
And the beast shall come forth surrounded by a roiling
cloud of vengeance. The house of the unbelievers shall
be razed and they shall be scorched to the earth. Their
tags shall blink until the end of days.
From The Book of Mozilla, 12:10

Ciao,
Puoi utilizzare il SendMessage di windows.
Dichiari 2 Messaggi proprietari nei due programmi "A & B"
Const
WM_CISONODATI = WM_USER + 100;
WM_DATILETTI      = WM_USER + 101;
Nel Programma A dichiari una procedure che risponde al messaggio :
FormA = class(TForm)
protected
   procedure CiSonoDati(Var Message:TMessage) message WM_CISONODATI;
end;
/---------/
procedure TFormA.CisonoDati(Var Message : TMessage);
begin
    // Qua' inserisci il codice che deve eseguire quando ci sono i dati!
    ShowMessage('Ci sono dati!!');
end;
Poi fai la stessa cosa sull'applicazione B gestendo pero' il messaggio
WM_DATILETTI.
Quando devi comunicare da A a B o vice versa utilizzi il SendMessage:
var
 H : Integer;
H := FindWindow(nil,'Nome della Finestra');
oppure (consigliata)
H := FindWindow('Nome Classe',nil); << Il nome della classe e TFORMA nel mio
esempio..
SendMessage(H,WM_CISONODATI); <<Manda il messaggio alla tua applicazione
Spero di averti aiutato
Ciao Silvio

C'e' qualche sistema per poterlo fare in modo pulito?
Sfrutta i messaggi di Windows : sono studiati anche per questo.
Esiste il modo di creare i messaggi utente aggiungendo delle costanti
a WM_USER.
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
--------------------------------------------------------------
"Partire e' un po' morire e morire e' partire un po' troppo !"
--------------------------------------------------------------

applicazione...
Dovrebbe essere vero ma in realtà non è così...
Ciao! :)
--
- Carlo -
BSSoftware Tips Mailing-List Support

Ciao,
per quanto riguarda lo scambio di messaggi tra applicazioni ti consiglio di
utilizzare in effetti i messaggi tra le finestre. Non è così semplice
passare un 'puntatore' ai dati, con il buon win 3.11 era abbastanza semplice
in quanto le applicazioni giravano nello stesso spazio di memoria e quindi
potevano condividere un buffer dati. Le applicazione a 32 bit girano in uno
spazio di memoria protetto e quindi non possono condividere porzioni di
memoria, il metodo più semplice che conosco (evitando quindi DDE, OLE
ecc...) è quello di utilizzare i Memory Mapped Files.


Usa la memoria condivisa (memory mapped file temporaneo).
E' incredibilmente semplice da usare..però devi usare un mutex per l'accesso
in mutua esclusione.
Vedi se riesci a risolvere tramite help, altrimenti posso mandarti un
componente che lo implementa..
Ciao,
-=SIMO=-

 E' incredibilmente semplice da usare..perň devi usare un mutex per


problema è solo quando si connette.
Perchè trasferire dati quando i dati sono già in locale ?
Con un MMF temporaneo entrambi i processi lavorano sugli stessi dati, senza
necessità di trasferimenti.
Tutto questo si traduce in un _notevole_ incremento di prestazioni.. ;)
Ciao,
-=SIMO=-