Cum pot porni/opri un executabil din interiorul aplicatiei ?

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Cum pot porni/opri un executabil din interiorul aplicatiei ?

Post by mesajflaviu » 12 Aug 2009, 14:37

As dori ca din interiorul aplicatiei mele sa pot porni un executabil ( de exemplu un driver sau eventual un alt program C++ ) dar la un moment dat as vrea sa opresc acel executabil ... se poate asa ceva , sau vreau ceva imposibil ?



User avatar
MrSmersh
Microsoft MVP
Microsoft MVP
Posts: 289
Joined: 20 Jul 2007, 10:18
Location: Timisoara
Contact:

Re: Cum pot porni/opri un executabil din interiorul aplicatiei ?

Post by MrSmersh » 12 Aug 2009, 16:04

aaa da
Pai pas 1 ar fi sa vezi functiile astea CreateProcess http://msdn.microsoft.com/en-us/library ... S.85).aspx si TerminateProcess http://msdn.microsoft.com/en-us/library ... S.85).aspx.
Cind vezi care e ideia discutam mai departe si rezolvam toate problemele de care ai putea da, documentai e de la MS deci exista sansa ca ei sa nu se fi exprimat in engleza :biggrin:

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum pot porni/opri un executabil din interiorul aplicatiei ?

Post by Ovidiu Cucu » 12 Aug 2009, 22:06

MrSmersh wrote:aaa da
Pai pas 1 ar fi sa vezi functiile astea CreateProcess [...]
Chiar si la
mesajflaviu wrote:[...]de exemplu un driver [...]
Richter ce zice, Catalin (MrSmersh)? :)

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: Cum pot porni/opri un executabil din interiorul aplicatiei ?

Post by cristianamarie » 13 Aug 2009, 08:36

ShellExecute si ShellExecuteEx isi fac si ele treaba.

@MrSmersh: TerminateProcess nu e un sfat de dat unui incepator. Corect?
Nuclear launch detected

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum pot porni/opri un executabil din interiorul aplicatiei ?

Post by Ovidiu Cucu » 13 Aug 2009, 13:43

Aplicatiile desktop se pot deschide folosind CreateProcess, ShellExecute, ShellExecuteEx, functiile din seria spawn sau pur si simplu system("nume_program.exe").
Dintre acestea, CreateProcess are avantajul ca de la mama ei e mai flexibila si in plus intoarce informatii despre procesul creat (handle, ID,...) care se pot folosi mai departe .
TerminateProcess e OK daca vrei sa "dai in cap" la un process care a luat-o razna, a ramas agatat, e vreun virusache sau pur si simplu "for fun". Un pic mai finutz ar fi sa inchizi o aplicatie trimitand, sa zicem, un WM_CLOSE la fereastra principala.

In cazul serviciilor/driverelor exista in Windows API funcii specifice cum ar fi StartService si ControlService. Vezi in MSDN topicurile "Starting a Service" si "Stopping a Service".

User avatar
MrSmersh
Microsoft MVP
Microsoft MVP
Posts: 289
Joined: 20 Jul 2007, 10:18
Location: Timisoara
Contact:

Re: Cum pot porni/opri un executabil din interiorul aplicatiei ?

Post by MrSmersh » 13 Aug 2009, 14:48

Dpv Windows CreateProcess e baza, si spawn si Shell mai mult sau mai putin cam tot pe acolo ajung si daca tot e sa studiezi ceva mcar sa fie asta cu care poti face tot si are 2 3 ciudatenii (si la shell am dat de din astea dar...). M-am gindit la terminate ca am handle la process, si nu eram sigur ca are o fereastra fie aia si ascunsa si ajungem la discutia cum ii gasesti hwnd... Recunosc e grobian da merge :biggrin:
Daca are fereastra always wm close... Si serviciile alta discutie

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum pot porni/opri un executabil din interiorul aplicatiei ?

Post by Ovidiu Cucu » 13 Aug 2009, 15:42

MrSmersh wrote:Dpv Windows CreateProcess e baza, si spawn si Shell mai mult sau mai putin cam tot pe acolo ajung si daca tot e sa studiezi ceva mcar sa fie asta cu care poti face tot si are 2 3 ciudatenii (si la shell am dat de din astea dar...). M-am gindit la terminate ca am handle la process, si nu eram sigur ca are o fereastra fie aia si ascunsa si ajungem la discutia cum ii gasesti hwnd... [...]
Daca ar fi sa sapam la baza, e posibil sa gasim si ceva mai jos... undeva prin ntddll.dll (vezi NtCreateProcess). Asta doar ca o informatie.
La chestia cu WM_CLOSE am scris "sa zicem". Bineinteles ca sunt si alte metode, sa zicem un WM_QUIT postat la threadului principal, un shutdown la computer sau o scoatere din priza.
S-ar putea scrie un tutorial intreg. ;)
Cum gasim fereastra principala dintr-o aplicatie (daca exista)? Se poate raspunde, nici o problema, totul e sa se intrebe.

In incheiere, un mic citat:
Windows Via C/C++ by Jeffrey Richter and Christophe Nasarre

You should use TerminateProcess only if you can't force a process to exit by using another
method. The process being terminated is given absolutely no notification that it is dying - the
application cannot clean up properly and cannot prevent itself from being killed (except by normal
security mechanisms). For example, the process cannot flush any information it might have in
memory out to disk.

User avatar
MrSmersh
Microsoft MVP
Microsoft MVP
Posts: 289
Joined: 20 Jul 2007, 10:18
Location: Timisoara
Contact:

Re: Cum pot porni/opri un executabil din interiorul aplicatiei ?

Post by MrSmersh » 13 Aug 2009, 17:52

Am zis ca e Q&D si dupa cum stii mie imi place sa deschid subiecte in care se discuta toate metodele cu pro si contra... Si de gasit fereastra ar fi interesant, da incercam un wiki?

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum pot porni/opri un executabil din interiorul aplicatiei ?

Post by Ovidiu Cucu » 13 Aug 2009, 20:39

MrSmersh wrote:[...] da incercam un wiki?
[ off -topic ]
Un wiki se poate incerca si as recomanda cu caldura http://www.ro.wikipedia.org.
Cel putin in materie de programare, am observat ca acolo exista o mana de oameni inimosi care au pornit la drum.
Cred totusi ca au nevoie de ajutor. Sunt multe definitii lipsa, multe care trebuie completate, multe care trebuie aduse la zi.
Ce zici, Catalin, te prinzi? Comunitatea romaneasca de programatori iti va fi recunoscatoare (aici nu glumesc).

Cu stima,
Ovidiu

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum pot porni/opri un executabil din interiorul aplicatiei ?

Post by mesajflaviu » 13 Aug 2009, 21:27

M-am documentat un pic si peste tot scrie ca trebuie evitat TerminateProcess care ar trebui folosita numai in situatii de urgenta , si ca intradevar mai bine s-ar trimite mesaje de inchidere : WM_CLOSE de exemplu ... mi-am adus cateva aplicatii demo care pornesc un proces .. dar nu-l mai pot opri ... deci cand nu are efect WM_CLOSE trebuie apelat TerminateProcess ?

User avatar
MrSmersh
Microsoft MVP
Microsoft MVP
Posts: 289
Joined: 20 Jul 2007, 10:18
Location: Timisoara
Contact:

Re: Cum pot porni/opri un executabil din interiorul aplicatiei ?

Post by MrSmersh » 14 Aug 2009, 11:42

@Ovidiu mutam dicutia pe WM_CLOSE, WM_QUIT? Sau ciudatenii cred ca se poate incrca si cu alea de endsession trimise doar la app aia :biggrin:
@ mesajflaviu intrebarea mare e ce app vrei tu sa controlezi, un exe oarecare, orice exe, un driver oarecare, orice driver, un serviciiu etc :biggrin:

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum pot porni/opri un executabil din interiorul aplicatiei ?

Post by Ovidiu Cucu » 14 Aug 2009, 15:40

MrSmersh wrote:[...]Sau ciudatenii cred ca se poate incrca si cu alea de endsession trimise doar la app aia :biggrin:
Concret, la ce te referi cu "alea de endsession trimise doar la app aia"? Te-ai gandit cumva la mesajul WM_QUERYENDSESSION? Cred ca incepi sa confunzi o tzara capra cu varza... ;)

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum pot porni/opri un executabil din interiorul aplicatiei ?

Post by mesajflaviu » 14 Aug 2009, 18:54

@ mesajflaviu intrebarea mare e ce app vrei tu sa controlezi, un exe oarecare, orice exe, un driver oarecare, orice driver, un serviciiu etc
As avea nevoie sa pornesc ( si dupa aceea sa opresc ) un driver , dar am incercat sa pornesc un executabil oarecare ( un alt program VC++ ) insa nu am mai reusit sa-l opresc cu ajutorul aplicatiei care l-a pornit ...

User avatar
MrSmersh
Microsoft MVP
Microsoft MVP
Posts: 289
Joined: 20 Jul 2007, 10:18
Location: Timisoara
Contact:

Re: Cum pot porni/opri un executabil din interiorul aplicatiei ?

Post by MrSmersh » 14 Aug 2009, 22:39

@Ovidiu no si ce are daca facem sa creada app ca se opreste sistemul, nu vrea cu binele o facem asta sa creada... Da e strange si sincer nu am mai testat de curind dar mergea.
@mesajflaviu deci un driver vrei sa opresti? Unu cunoscut? Sau unu facut intern?

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Cum pot porni/opri un executabil din interiorul aplicatiei ?

Post by Ovidiu Cucu » 17 Aug 2009, 00:43

MrSmersh wrote:@Ovidiu no si ce are daca facem sa creada app ca se opreste sistemul, nu vrea cu binele o facem asta sa creada... Da e strange si sincer nu am mai testat de curind dar mergea.
OK, sa zicem, ar fi o idee. Dar ce facem daca intoarce FALSE? O iertam? :)

Post Reply