Fermer un processus.

Fermer un processus. - Delphi/Pascal - Programmation

Marsh Posté le 13-04-2005 à 11:49:51    

Bonjour tout le monde.
Je m'appelle Vincent, j'ai 14 ans (mais tout le monde s'en fout lol).
Enfin, je vous présente la situation ^_^, j'"apprend" le delphi depuis hier, et je suis en train de concevoir un programme très "basic", lançant 3 applications DOS cachées (sw_hide).
Alors, problèmes que je n'arrive pas a résoudre :
1) Quand on quitte mon programme, les 3 fenêtres dos restent actives.
2) Je n'arrive pas a trouver/faire fonctionner une commande qui me permettrer de stoper les 3 exe, grace a mon bouton "arreter".
3) Si le prog n'est pas dans le meme repertoire que les 3 fenêtres dos, on clique sur "demarrer" et cela ne fait rien, y a t-il une commande type "check" ? pour vérifier la présence des 3 programmes dos ?
voici la commande que j'utilise pour lancer les 3 exe :

Citation :

procedure TForm1.Button1Click(Sender: TObject);
var
Si : STARTUPINFO;
Pi : PROCESS_INFORMATION;
begin
ZeroMemory(@si,sizeof(STARTUPINFO));
Si.dwFlags:=STARTF_USESHOWWINDOW;
Si.wShowWindow:=SW_HIDE;
CreateProcess(nil, 'dos1.exe',nil,nil,True,0,nil,nil,Si,Pi);
CreateProcess(nil, 'dos2.exe',nil,nil,True,0,nil,nil,Si,Pi);
CreateProcess(nil, 'dos3.exe',nil,nil,True,0,nil,nil,Si,Pi);
end;


 
J'utilise Delphi 6, voici une petite screen de mon "prog" :
http://img228.echo.cx/img228/5701/screen2cz.jpg
A oui j'oublier, quand on clic sur Démarrer, cela lance les 3 prog dos, et le bouton se transforme en "arreter" (plus pratique).
La tache bleu c'est une url que j'ai volontairement cachée.
Si la question a déja été posée, je m'excuse à l'avance.
Merci


Message édité par Vince131 le 13-04-2005 à 11:51:24
Reply

Marsh Posté le 13-04-2005 à 11:49:51   

Reply

Marsh Posté le 13-04-2005 à 12:24:36    

Je suppose que ça peut se faire avec TerminateProcess en utilisant le Handle mis dans les infos du process ("Pi" dans ton cas, mais tu vas donc devoir faire trois structures ou au moins garder les trois valeurs de Pi.hProcess)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 13-04-2005 à 12:35:04    

TerminateProcess(Pi.hProcess,0)
j'ai essayer ca... mais cela ne marche pas  :(

Reply

Marsh Posté le 13-04-2005 à 12:57:31    

Il renvoie quoi ?  
Fais un RaiseLastOsError s'il renvoie 0


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 13-04-2005 à 20:31:12    

Bon, je suis un peu pomé pour fermer les apps, mais ca c'est d'ordre N°2...
pour le moment ce qui compte le plus, ca serait la commande qui vérifie si les exe dos1 dos2 dos3 sont présents  :sweat: :( et si la réponse est négative, un showmessage('exes introuvables');, connaitrais tu le code ? j'ai cherché longtemps mais j'ai pas trouvé grand chose  :(

Reply

Marsh Posté le 13-04-2005 à 20:48:44    

if not FileExists('....') then
 ...


Message édité par antp le 13-04-2005 à 20:48:54

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 13-04-2005 à 21:28:08    

je vais tester ca ^^
merci beaucoup d'avance, meme si ca marche pas, c'est sympas de m'aider ^^ (ca a l'air bien vide ici).

Reply

Marsh Posté le 13-04-2005 à 21:30:18    

Ca marche !!!
merci beaucoup !!!!
alala ^^ suis trop content :p

Reply

Marsh Posté le 14-04-2005 à 09:38:12    

Hm ^_^ me revoila, Bonjour.
Alors, après des tas de tentatives ( :( ), toujours rien n'y fait pour ma commande "arreter" les processus. Donc j'ai pensé a une possibilité, mais je ne sais pas si c'est réalisable...
Alors je m'explique :
ctrl alt suppr, il y a une liste de processus, chaqun portant un nom (...exe, ...exe etc), après avoir cliqué sur mon bouton demarrer, les processus dos1 dos2 et dos3.exe apparaissent (logique, c'est le but), n'y a t'il pas une commande pour envoyer au system "fermer les processus ayant pour nom "dos1.exe" "dos2.exe" et "dos3.exe" ?
J'espère que j'ai été assez clair  :whistle:  
Merci de ton aide antp

Reply

Marsh Posté le 14-04-2005 à 10:05:50    

Il doit y avoir des fonctions pour rechercher des processus, mais je ne les connais pas par cœur, je te laisse faire la recherche :D Si ça se trouve, ça a été évoqué ici sur le forum.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 14-04-2005 à 10:05:50   

Reply

Marsh Posté le 14-04-2005 à 10:27:16    

ne jamais utiliser TerminateProcess() !!!
aucune libération des ressources n'est effectuée, c'est la pire des méthodes pour fermer un processus. c'est pour la même raison qu'il ne faut jamais stopper un thread brutalement, mais attendre qu'il se termine
 
la meilleure solution consiste à :
- utiliser EnumThreadWindows pour trouver la fenêtre associée au processus (via le theadID renvoyé par CreateProcess), et lui envoyer un WM_CLOSE
- oo bien utiliser PostThreadMessage(threadID, WM_QUIT, 0, 0) pour faire sortir le thread de sa boucle de messages
 
edit: on préferera la 1ere solution


Message édité par Harkonnen le 14-04-2005 à 10:28:24

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 14-04-2005 à 10:34:42    

Harkonnen a écrit :

ne jamais utiliser TerminateProcess() !!!
aucune libération des ressources n'est effectuée, c'est la pire des méthodes pour fermer un processus. c'est pour la même raison qu'il ne faut jamais stopper un thread brutalement, mais attendre qu'il se termine


 
Ha :D J'avais juste regardé en vitesse dans la doc ce qui commençait par "Terminate"


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 14-04-2005 à 10:38:51    

antp a écrit :

Ha :D J'avais juste regardé en vitesse dans la doc ce qui commençait par "Terminate"


je commence à comprendre d'ou viennent les leaks quand j'utilise Ant Renamer [:pingouino]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 14-04-2005 à 10:41:51    

Reply

Marsh Posté le 14-04-2005 à 10:42:10    

merci beaucoup pour vos réponse, mais je ne sais pas comment utiliser cette commande (EnumThreadWindows), tu pourrais me donner un exemple :s ?
 
j'dois passer pour un gros boulet  :(  vraiment désolé xD

Reply

Marsh Posté le 14-04-2005 à 10:42:36    

et un coup de pelle à clous pour antp qui lit pas la MSDN en entier :o
http://msdn.microsoft.com/library/ [...] rocess.asp

Citation :


If a process is terminated by TerminateProcess, all threads of the process are terminated immediately with no chance to run additional code. This means that the thread does not execute code in termination handler blocks. In addition, no attached DLLs are notified that the process is detaching.


 
edit: putain, en plus les dll restent attachées au processus, cette fonction est une calamité à elle seule [:pingouino]


Message édité par Harkonnen le 14-04-2005 à 10:43:45

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 14-04-2005 à 10:46:54    

Vince131 a écrit :

merci beaucoup pour vos réponse, mais je ne sais pas comment utiliser cette commande (EnumThreadWindows), tu pourrais me donner un exemple :s ?
 
j'dois passer pour un gros boulet  :(  vraiment désolé xD


y'a un exemple ici :o
http://msdn.microsoft.com/library/ [...] events.asp


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 14-04-2005 à 10:51:30    

Putain j'y comprend rien -_- c'est bon j'vais aller me jeter... j'sers trop a rien la -_-...
Merci quand meme pour votre aide... aurevoir

Reply

Marsh Posté le 14-04-2005 à 11:01:17    

Harkonnen a écrit :

et un coup de pelle à clous pour antp qui lit pas la MSDN en entier :o


 
Désolé de pas lire toute la doc avant de répondre sur le forum [:itm] Je supposais que celui qui utilise la fonction la liste, la doc.  
Et si j'avais dû l'utiliser j'aurais tout lu :p
 
Edit : Et toi, t'as pas lu la doc sur le protocole HTTP avant de faire ton plugin ? T'aurais vu qu'il fallait encoder les caractères spéciaux [:ddr555]


Message édité par antp le 14-04-2005 à 11:02:12

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 14-04-2005 à 11:01:44    

en delphi tu peux faire ça comme ça :
tu declare des tableaux, tu peux faire ça avec stringlist si tu veux..

Code :
  1. tabTexte : array[0..1000] of string;
  2. tabHandle : array[0..1000] of HWND;
  3. nbwin : integer;


 
la fonction callback

Code :
  1. function EnumWindowsCallback(hWnd: HWND; lParam: LPARAM): BOOL;
  2. var Texte : array[0..250] of Char;
  3. begin
  4.   inc(nbwin);
  5.   GetWindowText(hWnd, Texte, SizeOf(Texte));
  6.   tabHandle[numFenetre] := hWnd;
  7.   tabTexte[numFenetre] := string(Texte);
  8.   if nbwin < 1000 then
  9.        result := true
  10.   else
  11.        result := false;
  12. end;


 
et finalement tu utilises ça tu affiche les handle et le caption des fenêtres dans un TListbox par exemple :

Code :
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. nbwin := 0;
  3. EnumWindows(@EnumWindowsCallback,0);
  4.   for i := 0 to nbwin do
  5.      ListBox1.items.add('Texte: '+tabTexte[i]+'    Handle: '+IntToStr(tabHandle[i]));
  6. end;


 
apres il te reste plus qu'a chercher le texte que tu veux, tu prends le handle et tu envoi un WM_CLOSE comme te dit Harkonnen
 
sinon doit y'avoir des exemples sur des sites genre delphifr ou phidels par exemple.
bonne chance :)


---------------
Always wear a camera!
Reply

Marsh Posté le 14-04-2005 à 11:02:56    

antp a écrit :


Edit : Et toi, t'as pas lu la doc sur le protocole HTTP avant de faire ton plugin ? T'aurais vu qu'il fallait encoder les caractères spéciaux [:ddr555]


coup bas [:shooter]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 14-04-2005 à 12:35:30    

elle est bien, l'icone du truc là [:atsuko]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 14-04-2005 à 12:48:36    

the real moins moins a écrit :

elle est bien, l'icone du truc là [:atsuko]


:??:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 14-04-2005 à 12:50:18    

Reply

Marsh Posté le 14-04-2005 à 12:50:42    

Il parle de l'image dans le 1er post je suppose
 
edit : [:benou_grilled]


Message édité par antp le 14-04-2005 à 12:50:53

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 14-04-2005 à 13:08:25    

C'est une image d'un mmorpg (Ragnarok Online)...
Enfin voilà, me manque plus qu'a comprendre/trouver une fonction pour fermer les 3 dos, et l'appliquer aussi pour "OnClose" de manière a les fermer quand on quitte mon programme.
Merci ^^

Reply

Marsh Posté le 14-04-2005 à 13:44:01    

3 Processus ? Ragnarok Online ?
snif, snif,... Spas bien. (En plus sur la même machine Oo ? Ca doit mettre pas loin d'une demi-heure pour démarrer...)

Reply

Marsh Posté le 15-04-2005 à 09:44:17    

Non pas un brain ^^
4-5 seconde max sur mon 3000+ 64bit, 1go ddr.
Fin bref... si tu sais ce que c'est, ca m'arrangerait qu'on évite d'en parler ^^ (tu vois ce que je veux dire). Merci  :lol:

Reply

Marsh Posté le 15-04-2005 à 09:50:29    

euh.. je pense que je vais fermer ce topic [:heink]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed