Newsgroup: it.comp.lang.visual-basic
Titolo: Interazione tra applicazioni

Buongiorno a tutti.
Ho due applicazioni VB6 in esecuzione sullo stesso computer e vorrei
fare in modo che un evento di un'applicazione (per esempio la pressione
di un pulsante) scateni automaticamente un evento dell'altra
applicazione (o, equivalentemente, richiami la funzione associata a
quell'evento).
Qualcuno può darmi qualche dritta?
Grazie.
Cristian

 ha scritto nel messaggio 
news:1146641931.7...@e56g2000cwe.googlegroups.com...

Hai diverse possibilita'.
Se e' uno scenario client-server, cioe' dove una sola delle due comanda:
1) Trasformi l'applicazione che deve rispondere in un Exe ActiveX
Oppure, se entrambe devono comunicare tra loro o se l'idea di usare un Exe 
ActiveX non ti piace:
2) Inserisci una form con un nome assurdo. Tipo 
"aajajajahdhuhuhdsfhiahuiohuahudouahooho".
Sulla form in questione inserisci un qualsiasi controllo di comodo (un 
textbox va benissimo).
Quando l'applicazione parte carica la form in questione e cerca l'HWND del 
controllo sulla corrispettiva form dell'altro applicativo. A quel punto puoi 
scegliere un qualsiasi messaggio standard di VB da usare per comunicare.
3) Subclassing.
E' piu' breve a scriversi del punto 2, ma piu' incasinato ad implementarsi e 
meno sicuro.
4) Msdn->named pipes.

> cerca l'HWND del controllo sulla corrispettiva form dell'altro applicativo
penso di essere quasi arrivato ad una soluzione, solo mi manca questo
passaggio. come posso farlo?



 ha scritto nel messaggio 
news:1146646385.7...@j33g2000cwa.googlegroups.com...

Sono incasinatissimo su un'algoritmo che non mi torna, quindi potrei aver 
sbagliato qualcosa nel messaggio iniziale o star sbagliando qualcosa in 
questo.
Al momento non ricordo come si fa a ritrovare un controllo sulla form.
Potresti usare la FindWindow per trovare la form e poi inviare direttamente 
a lei il messaggio.

Chiedo scusa per l'insistenza, ma è la prima volta che mi cimento in
un problema come questo. :P
L'applicazione "server" conosce l'handle dell'applicazione "client"
perchè la apre lei stessa con la funzione Shell. Ho anche capito come
passare messaggi con la funzione SendMessage, solo non trovo un modo
per far ricevere all'applicazione client il messaggio. Avevo pensato di
inviare il codice ascii di un carattere speciale all'applicazione
client e di gestire di conseguenza l'evento KeyPress, ma trattandosi di
un form mdi questo non sembra essere possibile.
Premesso questo, quando dici "e poi inviare direttamente a lei il
messaggio." cosa intendi esattamente?
Grazie dell'aiuto.

SoftConnection ha scritto:

Ciao, potresti usare due metodi :
Il primo poco scientifico, ma funzionale, consiste nel testare con un 
timer l'esistenza di un file, se lo trovi scateni l'evento che ti 
interessa e lo cancelli. Chiaramente il file lo deve generare il secondo 
programma.
Il secondo metodo, ti pemette senza l'utilizzo di api e diavolerie 
simili, di replicare quello che scrivi ad esempio in una label pari pari 
su un'altro programma. Per farlo puoi usare la propietà LinkTopic del 
controllo.
Esempio con label:
Definisci sul primo programma che deve generare l'evento una label.
Nella proprietà LinkTopic metti 
NomeProgramma|Form_che_conterra_la_label_sul_secondo_programma
nella proprietà LinkItem = metti il come della label così come la 
chiamerai sul secondo programma.
all'avvio inizializzi :
Label1.LinkMode = vbLinkAutomatic
Sul secondo programma
Definisci la label sul form puoi anche nasconderla dalla 
visualizzazione, e quando tutti e due i programmi sono i n esecuzione 
quando dal secondo programma scriverai sulla label pari pari verra 
replicato sulla label del primo programma.
Spero di essere stato chiaro.
Ciao Sybill

 LinkTopic del controllo.
Detto anche DDE (Dynamic Data Exchange)...
Aggiungo che č una tecnica ormai vecchiotta, ma che per scopi come questo
funziona abbastanza bene.
Bye
Raf

Drizzt ha scritto:

Ciao, potresti usare due metodi :
Il primo poco scientifico, ma funzionale, consiste nel testare con un 
timer l'esistenza di un file, se lo trovi scateni l'evento che ti 
interessa e lo cancelli. Chiaramente il file lo deve generare il secondo 
programma.
Il secondo metodo, ti pemette senza l'utilizzo di api e diavolerie 
simili, di replicare quello che scrivi ad esempio in una label pari pari 


Ho capito la soluzione, ma in fase di esecuzione mi viene dato un
errore, mi viene detto che nessuna applicazione ha risposto alla
chiamata DDE (la seconda applicazione, ovviamente, viene prima lanciata
e poi linkata).
lblChiamante.LinkTopic = "Applicazione|mdiApplicazione"
lblChiamante.LinkItem = "lblAppoggio"
lblChiamante.LinkMode = vbLinkAutomatic
Applicazione è il nome dell'applicazione così come lo trovo anche nel
Task Manager, mdiApplicazione è il nome assegnato al form contenente
lblAppoggio. Bisogna utilizzare le proprietà (Name), esatto?

 Aggiungo che è una tecnica ormai vecchiotta
Vecchiotta... è stata abbandonata dai tempi di windows 3.1 :)
Ciao

SoftConnection ha scritto:

Allora come ti diceva Rafunk, la tecnica si chiama DDE, e si trova un 
bel po' di documentazione in giro.
Cmq. si, bisogna usare name.
LinkTopic e LinkItem io non li metto a codice ma direttamente sulla 
proprietà in fase progettazione.
Scusa nel primo esempio ho dimanticato di dirti che nel secondo 
programma nelle proprietà del form che contiene la label devi mettere:
LinkMode = 1 - Source
LinkTopic = Form1 (o meglio la proprietà name del form stesso)
Ciao Sybill


Sul mio pc ove ho Office 2000 (mica 2.0)
Pannello di controllo --> Opzioni cartella --> Tipi di file --> XLS "Foglio di
lavoro di Microsoft Excel" --> Avanzate --> Scegli un'operazione e premi
Modifica. Osserva bene la finestra di dialogo.
Idem x Word, Access etc...
Credo che sia la tecnica usata per consentire l'apertura multipla di documenti
usando una sola istanza del programma.
Quindi non è poi così abbandonata!
Bye
Raf

 Quindi non č poi cosě abbandonata!
Ho sbagliato verbo: scegli tra deprecata e obsoleta :)
E' un po' come le app 16bit: non le fa piů nessuno e si sconsiglia l'uso su 
so 32bit ma sono comunque supportate (e forse girano pure :P ).
Ciao 

 ha scritto nel messaggio 
news:1146650438....@j73g2000cwa.googlegroups.com...

Chiamiamole Client e Server, come le hai chiamate tu, Client che deve 
ricevere i messaggi e Server che li invia.
L'handle della Shell non ricordo cosa significhi, ma di sicuro non e' 
l'handle di una delle finestre dell'applicativo.
In brevis: all'applicazione che deve ricevere i messaggi devi aggiungere una 
finestra, che viene caricata all'avvio e resta invisibile.
Questa finestra deve avere un titolo che sia ASSOLUTAMENTE univoco. Piu' e' 
lungo ed assurdo, meglio e'.
La finestra in questione sara' quella che riceve i messaggi. A questo punto 
l'altra applicazione deve recuperare l'handle della finestra ed inviare ALLA 
FINESTRA i messaggi. Non si inviano messaggi alle applicazioni, chi gestisce 
i messaggi sono le finestre. (oppure prenditi un bel libro su Win32 e 
scoprirai che non e' vero)
Codice di invio:
Dim a As Long
a = FindWindow("ThunderFormDC", "titoloassurdodellafinestradidestinazione")
SendMessage a, WM_KEYDOWN, 0, 0

Grazie mille a tutti quanti per i consigli, alla fine ho scoperto
l'esistenza della funzione LinkExecute e, inserendo una textbox in ogni
applicazione, ho predisposto lo scambio di messaggi e la loro gestione.
Alla prossima!


vorrei precisare che nel compilato la classe č: ThunderRT6FormDC
ciao