Newsgroup: it.comp.programmare.win32
Titolo: Come far comunicare processi diversi con Win98?

Come si fa a far comunicare due programmi diversi sotto Win9x? Ho letto che
una unnamed pipe può essere solamente ereditata dai processi figli. Ma se ho
due programmi diversi?
Grazie,
    Max

 due programmi diversi?
Allora non puoi usare una unnamed pipe:-).  Tuttavia, ti resta una
"enorme-1" varieta` di possibilita`:-).
La prima cosa da prendere in considerazione sono le socket (ed
eventualmente varie strutture piu` astratte che poggiano su di
esse), poiche` esse ti offrono, un domani, la possibilita` di spostare
uno dei due programmi su di una scatola diversa da quella dove
gira l'altro.  Le strutture di comunicazioni non basate (a un
qualche livello) su socket (o named pipe) queste possibilita`
di "distribuzione" dell'applicazione non te le offrono.  Fra le
strutture piu` astratte che possono appoggiarsi sulle socket
vi e` il DCOM (non prenderei in considerazioni altre strade a
mezza via fra socket nude e COM/DCOM, come l'RPC).
Ritengo il COM il modo piu` elegante, comodo, e potente, per
realizzare questo tipo di cose, e non sono il solo a pensarla
cosi` (ottimo, a modo suo, anche CORBA, di cui pure esistono
versioni gratuite per varie piattaforme, Windows a 32 bit
inclusa; non ti aspettare pero`, soprattutto dalle versioni
gratis, le stesse prestazioni che ti da` COM/DCOM!!!).
Se per qualche ragione le socket non ti vanno bene, la cosa
piu` semplice potrebbe essere l'uso di messaggi; si possono
spedire messaggi a window qualsiasi, anche a quelle di un altro
processo.  E puoi avere una window nascosta fatta solo allo
scopo di ricevere i messaggi.  Il messaggio WM_COPYDATA
e` fatto apposta perche` un'applicazione possa spedire ad
un'altra un tot di dati; puoi anche usare altri messaggi da te
stesso definito, se ti bastano i 64 bit di dati che un messaggio
si porta dietro, o se il grosso dei dati preferisci appoggiarli
altrove, come ad esempio in un file o sulla clipboard (non ti
suggerisco quest'ultima soluzione perche` puo` essere
sconcertante per l'utente interattivo che non sa nulla della
comunicazione in corso e si trova "sporcata" la clipboard).
I messaggi, in generale, puoi spedirli sia con SendMessage
(sincrono, attende risposta) sia con PostMessage (asincrono,
torna immediatamente), ma quest'ultimo non e` un'opzione
per WM_COPYDATA.
Se hai grosse moli di dati da condividere, puo` valer la pena
di prendere in considerazione la "shared-memory", che e`
un caso particolare di "file-mapping"; verifica le varie API
relative a questi concetti, come CreateFileMapping,
MapViewOfFile, ecc.  Due processi separati che accedano
entrambi ad un file (e/o file-mapping, inclusa la shared
memory) andranno inoltre sincronizzati utilizzando gli
appositi oggetti di kernel (tipicamente dei Mutex, ma fanno
comodo anche oggetti Event e Semaphore, a seconda
dei casi).  Incidentalmente, notiamo che e` possibile
ottenere la condivisione di certi dati anche attraverso
una DLL con certi speciali attributi (il che "maschera" l'uso
della shared memory -- ma NON toglie la necessita` di
sincronizzare esplicitamente i processi usando gli appositi
kernel objects!!!); ma questa e` una possibilita` che in
pratica esiste solo per compatibilita` con vecchi Windows
a 16 bit, non e` chiaro quanto sia solida ecc ecc, e non ti
consiglio assolutamente di usarla (a meno di speciali
esigenze di portabilita` a Windows a 16 bit...).
Altre cose che esistono sostanzialmente per compatibilita`
con il passato, e non ti consiglio di usare in programmi
nuovi, sono il DDE in qualsiasi forma e quel pastrocchio
dei "Mailslot".
Sono sicuro di essermi scordato qualche altra possibilita`,
proprio perche` ce ne sono tante, ma tante...!-)
Alex