![]() |
| | #1 (permalink) | ||
| Registered User Join Date: Dec 2001 Location: bucuresti | process communication
am doua procese: proces1 si proces2. in proces1, in main, dau CreateProcess(), pentru a deschide proces2. Intrebare: cum obtin un handler al procesului 1 din procesul 2?
__________________ Darkness is my light! | ||
|
| | #2 (permalink) | ||
| Registered User Join Date: May 1999 |
Nu poti pasa direct handle-ul din proc1 in proc2 pentru ca un handle e valid doar in scope-ul procesului in care a fost creat, doar id-ul e unic global. Faci GetCurrentProcessId() in parent, il pasezi child-ului, iar din child faci OpenProcess() cu id-ul respectiv si vei obtine un handle. 1) Cel mai simplu e sa pasezi id-ul parent-ului cand il creezi pe junior ca si parametru de command line, vezi al doilea parametru al CreateProcess(), iar din child il iei cu GetCommandLine() Daca nu e acceptabil sa primesti id-ul parintelui ca parametru, atunci: 2) il poti trimite ca variabila de environment 3) Daca nu ai fereastra in proc2, il poti pasa printr-un thread message cu PostThreadMessage. La CreateProcess(proc2) ti se completeaza structura de tip PROCESS_INFORMATION pe care ai dat-o, cu datele noului process creat printre care si id-ul thread-ului child (dwThreadId), caruia ii trimiti un mesaj custom din thread-ul parinte cu PostThreadMessage(). Vezi ca procesul nu se creaza instantaneu, va trebui sa faci un loop cu PostThreadMessage() pana i se naste child-ului message queue-ul pana si nu vei mai primi eroare la Post. 4) Daca in proc2 ai fereastra, ii faci RegisterClass() cu un class name unic din burta si din proc1 faci un FindWindow() dupa class name-ul repectiv. Dupa care faci un PostMessage() la HWND-ul obtinut cu un custom message obtinut prin RegisterWindowMessage() cu acelasi nume in ambele procese, si cu care mesaj trimiti id-ul parintelui catre child. 5) Metoda generica e sa enumeri in child toate procesele si sa vezi care figureaza ca parent al procesului tau. Faci CreateToolhelp32Snapshot() ca sa iei lista, apoi Process32First() ca sa iei primul element, apoi Process32Next() intr-un loop ca sa le iei pe urmatoarele. Fiecare element din lista e un PROCESSENTRY32, asa ca faci loop-ul pana ajungi la elementul ce are th32ProcessID = cu id-ul tau, al child-ului, dupa care din elementul respectiv iei th32ParentProcessID. 6) Faci un fisier, din parinte scrii in el id-ul, si din child il citesti. Cu variatiunea "faci un registry key", etc. Mai sunt si alte metode dar sunt overkill pentru a transmite 4 bytes. | ||
|
| | #4 (permalink) | ||
| Registered User Join Date: Dec 2001 Location: bucuresti |
Multumesc pentru raspunsuri. Eu rezolvasem problema ca la punctul 5 din postul lui stunn, dar credeam ca e ceva mai banal or something. Pana la urma am lasat-o asa. As mai avea o intrebare(off topic ce-i drept, dar nu mai fac alt post). Stiti vreun link cu documentatie despre hash table-uri?(sau daca aveti vreo carte unde scrie si mi-ati putea trimite). Merci.
__________________ Darkness is my light! | ||
|
| | #5 (permalink) | ||
|
Urat, primul lucru care mi-a trecut prin minte a fosr /var/run, dupa care mi-am dat seama ca win nu are un standard pentru asta(e varianta 6, dar poate fi si mapat din memorie daca e mount tmpfs).
__________________ I killed the entire vault and I'm a Vault Guardian! I wish my dad could see me now. | |||
|
![]() |
|
| Thread Tools | |
|
|