Mikä on tehokkain tapa välittää tietoa kahden ohjelman välillä, jotka ovat samalla koneella (windowsissa)? Tiedon täytyisi siirtyä reaaliajassa, joten tiedostojen käyttö ei oikein toimi.
Socketilla onnistunee aika simppelisti.
Onnistuneeko? Voiko socketilla päättää mille ohjelmalle tiedon lähettää, vai meneekö se vain sille, joka sen sattuu vastaanottamaan?
Se menee sille, jolla sattuu olemaan socket, joka kuuntelee sitä nimenomaista porttia, hyväksyy yhteyspyynnön ja vastaanottaa tiedon. Socketit ovat suhteellisen mutkikkaita laitoksia.
Pipe voi olla enemmän oikea väline, mutta niiden käytössä en osaa auttaa. Socketillakin toki onnistuu.
COM:lla pystyy myös keskustelemaan prosessien yli, mutta vaatii perehtymistä comin sielunelämään.
Yhtenävaihtoehtona on toteuttaa se MMF:llä (Memory-Mapped File)
http://msdn.microsoft.com/library/default.asp?
rutkis kirjoitti:
COM:lla pystyy myös keskustelemaan prosessien yli, mutta vaatii perehtymistä comin sielunelämään.
COM:n käyttö ei ole järkevää jos molemmat prosessit pyörivät samassa koneessa. Oikea hyöty niistä saadaan silloin, jos pitää kommunkoida eri koneissa olevien mokkuloiden välillä.
Mutta onhan niitä tapoja: socket, pipe, jotka tulivat jo mainittua. Myös jaettu muisti, copydata, SendMessage...
Entäs DDE (Dynamic Data Exchangeko se oli)?
Joo sendii vaik winsockilla dataa loopbackin kautta toiselle ohjelmalle.
Kiitos kaikille ehdotuksista, mutta tuo SendMessage vaikuttaa helpoimmalta. Miten saan ikkunan kahvan, kun minulla on siitä PROCESS_INFORMATION-struktuuri?
Ihan vaan villinä arvauksena että oisko process_information.hwnd?
Ei, siinä on vain HANDLEt prosessille ja threadille ja DWORD-muotoiset id:t samoille. Mutta tajusin vasta, että toisella prosesseista ei välttämättä ole ikkunaa, joten tuo ei toimi. Voisiko joku kertoa, miten nuo piiput toimivat?
Win95, Win98 ja WinME eivät toimi näin, mutta uudemmat kyllä:
CreateNamedPipe
CreateFile (piipun nimellä kutsuttuna)
WriteFile, ReadFile
=> Google & MSDN :)
Ja SendMessagen tilalle löytyy PostThreadMessage.
Ohjelmien välisessä kommunikoinnissa hwnd:n pitää olla muistaakseni HWND_BROADCAST, jotta viesti menee kaikille pyöriville prosesseille. Lähetettävän viestin id pitää olla wm_user-tyyppinen ja sen pitää olla rekisteröity ennen lähetystä RegisterWindowMessage()-funktiolla.
Tarkemmat tiedot löytyvät: http://msdn.microsoft.com/library/default.asp?
Aihe on jo aika vanha, joten et voi enää vastata siihen.