Computer Games Forum
 

Go Back   Computer Games Forum > Tech > The Workshop > Limbaje de programare

Notices

Căutare produse PC Garage: Şterge căutarea

Reply
 
LinkBack Thread Tools
Old 30-09-2006, 02:31   #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!
 
Harvester is offline    Reply With Quote
Old 30-09-2006, 06:32   #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.
 
stunn is offline    Reply With Quote
Old 02-10-2006, 11:33   #3 (permalink)
Registered User
 
cloud's Avatar
 
Join Date: Oct 2003
Location: Bucuresti
o alternativa ar fi sa creezi un pipe. ideea e ca un proces scrie in pipe si celalalt citeste. din cate imi aduc aminte e si multithreaded. (CreatePipe)
 
cloud is offline    Reply With Quote
Old 03-10-2006, 11:27   #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!
 
Harvester is offline    Reply With Quote
Old 03-10-2006, 11:55   #5 (permalink)
Registered User
 
Scorpio83's Avatar
 
Join Date: Feb 2005
Location: pinknaziponyland
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.
 
Scorpio83 is offline    Reply With Quote
Old 04-10-2006, 08:38   #6 (permalink)
Registered User
 
Dark's Avatar
 
Join Date: Nov 1999
Wikipedia iti zice tot ce vrei despre hash tables.
__________________
Scarbit de fapta ta cea rea
Degeaba plangi, acum, copile,
Ci du-te'n casa-acum si zi-le
Parintilor, isprava ta.
 
Dark is offline    Reply With Quote
Advertisment
Reply

  Computer Games Forum > Tech > The Workshop > Limbaje de programare

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On
Forum Jump


All times are GMT +2. The time now is 22:35.


Advertisement System V2.5 By   Branden
This site is copyrighted ©1997 - 2008, Computer Games Online SRL