Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
887 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  Fermer un processus.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fermer un processus.

n°1045615
Vince131
Posté le 13-04-2005 à 11:49:51  profilanswer
 

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
mood
Publicité
Posté le 13-04-2005 à 11:49:51  profilanswer
 

n°1045676
antp
Super Administrateur
Champion des excuses bidons
Posté le 13-04-2005 à 12:24:36  profilanswer
 

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
n°1045690
Vince131
Posté le 13-04-2005 à 12:35:04  profilanswer
 

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

n°1045716
antp
Super Administrateur
Champion des excuses bidons
Posté le 13-04-2005 à 12:57:31  profilanswer
 

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1046534
Vince131
Posté le 13-04-2005 à 20:31:12  profilanswer
 

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  :(

n°1046545
antp
Super Administrateur
Champion des excuses bidons
Posté le 13-04-2005 à 20:48:44  profilanswer
 

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


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

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1046594
Vince131
Posté le 13-04-2005 à 21:28:08  profilanswer
 

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).

n°1046596
Vince131
Posté le 13-04-2005 à 21:30:18  profilanswer
 

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

n°1047002
Vince131
Posté le 14-04-2005 à 09:38:12  profilanswer
 

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

n°1047019
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-04-2005 à 10:05:50  profilanswer
 

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
mood
Publicité
Posté le 14-04-2005 à 10:05:50  profilanswer
 

n°1047044
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 14-04-2005 à 10:27:16  profilanswer
 

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)
n°1047052
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-04-2005 à 10:34:42  profilanswer
 

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
n°1047057
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 14-04-2005 à 10:38:51  profilanswer
 

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)
n°1047060
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-04-2005 à 10:41:51  profilanswer
 
n°1047061
Vince131
Posté le 14-04-2005 à 10:42:10  profilanswer
 

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

n°1047063
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 14-04-2005 à 10:42:36  profilanswer
 

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)
n°1047071
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 14-04-2005 à 10:46:54  profilanswer
 

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)
n°1047074
Vince131
Posté le 14-04-2005 à 10:51:30  profilanswer
 

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

n°1047090
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-04-2005 à 11:01:17  profilanswer
 

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
n°1047091
Flaie
No it's necessary
Posté le 14-04-2005 à 11:01:44  profilanswer
 

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!
n°1047094
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 14-04-2005 à 11:02:56  profilanswer
 

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)
n°1047245
the real m​oins moins
Posté le 14-04-2005 à 12:35:30  profilanswer
 

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


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°1047265
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 14-04-2005 à 12:48:36  profilanswer
 

the real moins moins a écrit :

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


:??:


---------------
J'ai un string dans l'array (Paris Hilton)
n°1047267
the real m​oins moins
Posté le 14-04-2005 à 12:50:18  profilanswer
 
n°1047268
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-04-2005 à 12:50:42  profilanswer
 

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
n°1047291
Vince131
Posté le 14-04-2005 à 13:08:25  profilanswer
 

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 ^^

n°1047335
Mackila
Posté le 14-04-2005 à 13:44:01  profilanswer
 

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...)

n°1048330
Vince131
Posté le 15-04-2005 à 09:44:17  profilanswer
 

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:

n°1048348
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 15-04-2005 à 09:50:29  profilanswer
 

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


---------------
J'ai un string dans l'array (Paris Hilton)
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  Fermer un processus.

 

Sujets relatifs
Setter une variable d'environment pour tous les processus.(XP/2000)Soucis pour fermer des fenetres
[VisualFoxPro] comment fermer un processus externe?ne pas fermer commandbar
Créer un Thread, c'est bien et le fermer...?Un script pour tuer les processus
Fermer un popup quand un DL commence"Fermer" une frame
[VBA] Excel : perte variables globales sans fermer le classeur 
Plus de sujets relatifs à : Fermer un processus.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR