Comunicare interprocese (IPC) in Delphi

Comunicare interprocese (IPC) in Delphi

Postby v0id » 20 Mar 2011, 20:54

Comunicarea interprocese (IPC) este un subiect pe care de mult timp vreau sa fac un mic tutorial.
Am ajuns insa la concluzia ca un tutorial va veni foarte greu din partea mea. Nu am timp si nici rabdare sa scriu, mai ales ca acest subiect este foarte vast.
In schimb, m-am gandit sa ma folosesc de sectiunea Snippets ca sa-mi ating scopul intr-o oarecare masura.

Pe scurt, este posibil oricand ca intr-un proiect sa fie implicate mai multe procese care la runtime trebuie sa comunice intre ele.
De exemplu, poate una dintre aplicatiile ce fac parte din proiect este scrisa intr-un limbaj de programare, dar aveti nevoie de un modul scris in alt limbaj de programare.
Daca cele doua module mai trebuie sa si schimbe informatii intre ele, se anunta un pic de distractie :)


Am pregatit doua exemple in Delphi care prezinta cate un mod de comunicare interprocese. Codul este chiar minimal, pentru a fi cat mai usor de inteles. Am pus si comentarii - chiar daca sunt in engleza, ar trebui sa va prindeti despre ce e vorba. Sorry, dar eu nu mai pot sa dau comentarii in romana. Am incercat la alte snippet-uri si parca suna ca dracu' :D
Fiecare dintre cele doua exemple contine cate o aplicatie "Sender" si un "Receiver".

1. WM_COPYDATA.zip - se bazeaza pe message queue-ul aplicatiilor pentru comunicare. In acest caz am folosit un mesaj deja existent in Windows, numit WM_COPYDATA.
Se pot defini si mesaje custom, folosind API-ul RegisterWindowMessage, dar m-am gandit ca nu e cazul sa complic lucrurile.

2. Named Pipes.zip - va puteti imagina doua procese care acceseaza acelasi fisier si il folosesc pentru a transmite informatii intre ele. Mai multe informatii despre named pipes aici. Mentionez ca pentru acest exemplu am folosit un wrapper free peste API-urile de Windows, care usureaza enorm lucrul cu named pipes. Este scris de Russell Libby si se gasea aici. Vad ca pagina nu se mai incarca... Gasiti oricum codul respectiv in fisierele "Pipes.pas" din arhiva.


Nu intru in detalii despre cum functioneaza cele doua metode de comunicare. Gasiti documentatie berechet pe net.
Vreau doar sa subliniez cateva chestiuni care ar trebui luate in considerare daca ar fi sa alegeti intre cele doua:

- WM_COPYDATA presupune ca cel putin unul din cele doua procese trebuie sa aiba queue de mesaje pentru a putea primi informatiile transmise de catre celalalt proces.
Deci nu este posibil sa folositi aceasta metoda daca aveti doua procese ce ruleaza in linie de comanda. Cu named pipes nu aveti aceasta problema.

- Daca folositi WM_COPYDATA, procesele voastre trebuie neaparat sa ruleze pe aceeasi masina. In cazul named pipes, procesele pot comunica chiar daca ruleaza pe masini diferite aflate in aceeasi retea.

- Procese care ruleaza in sesiuni diferite de logon (sau UAC activat si un proces ruleaza sub account de administrator, iar celalalt nu). Metoda cu WM_COPYDATA nu va functiona.
Dau un exemplu cat se poate de simplu: pe un Windows Vista sau mai nou, activati UAC si dati restart. Faceti logon cu un account de administrator. Dati "Run as Administrator" pe aplicatia WM_COPYDATA_Receiver.exe. Porniti FARA "Run as Administrator" aplicatia WM_COPYDATA_Sender.exe. Incercati sa trimiteti un mesaj catre receiver. Mesajul nu va fi primit de catre acesta. Faceti acelasi test cu aplicatiile din arhiva "Named Pipes" - surpriza!
3.5p / 2 votes
Attachments
Named Pipes.zip
(672.32 KiB) Downloaded 74 times
WM_COPYDATA.ZIP
(532.35 KiB) Downloaded 32 times
A good coder is never on holiday - he may be working on a different machine, that's about as far as it gets.
User avatar
v0id
Word
 
Joined: 05 Jan 2010
Location: 127.0.0.1
Status: 42.5

Return to Snippets

Who is online

Users browsing this forum: No registered users and 0 guests

cron