Lancer et arreter un EXE avec ShellExecuteEx

Résolu
taggle Messages postés 7 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 27 octobre 2009 - 21 juil. 2009 à 10:24
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 24 juil. 2009 à 09:46
Salut voici mon puissant code qui lance notepade2.exe
#include <windows.h>
#include <stdlib.h>
#include <shellapi.h>
#include <stdio.h> 
using namespace std;

int main(int argc, char *argv[])
{
    
SHELLEXECUTEINFO ExecuteInfo;    
memset(&ExecuteInfo, 0, sizeof(ExecuteInfo));
ExecuteInfo.cbSize       = sizeof(ExecuteInfo);                                  
ExecuteInfo.lpFile       = "C:\\Notepad2.exe";  
if(ShellExecuteEx(&ExecuteInfo) == FALSE)
{
// erreur
}    
    printf("looool\n"); 
    system("PAUSE");
    return EXIT_SUCCESS;
}


J'aimerai savoir s'il est possible via des identifiants d'arreter via une commande l'application que je viens de lancer. Merci

6 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
21 juil. 2009 à 18:38
Salut,

[quote=taggle]j'aime me parler à moi meme/quote

Bin on va essayer de te faire un peu la conversation alors !

A la fin, faut faire un CloseHandle sur les handles récupérés dans la PROCESS_INFORMATION. (Si si, c'est dans la doc).

CloseHandle(piProcessInfo.hProcess);
CloseHandle(piProcessInfo.hThread);

Le :
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
sert à rien, c'est un paramètre de sortie.

Le :
using namespace std;
Ca sert quand tu fais du C++ et que tu inclus des headers de la STL (iostream...). Là t'as que du C...

Tu n'as plus besoins de shellapi.h, qui te servait pour ShellExecute.
3
taggle Messages postés 7 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 27 octobre 2009
21 juil. 2009 à 10:36
j'ai trouvé :
#include <windows.h>
#include <stdlib.h>
#include <shellapi.h>
#include <stdio.h> 
using namespace std;

int main(int argc, char *argv[])
{
    
STARTUPINFO         siStartupInfo;
PROCESS_INFORMATION piProcessInfo;

memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
siStartupInfo.cb = sizeof(siStartupInfo);
if(CreateProcess(NULL,"c:\\Notepad2.exe ",0,0,FALSE,
                     CREATE_DEFAULT_ERROR_MODE,0,0,                              
                     &siStartupInfo,&piProcessInfo) == FALSE)
{
// erreur
}
  
    
    Sleep(2000);
   PostThreadMessage(piProcessInfo.dwThreadId, WM_QUIT, 0, 0);


    printf("looool\n"); 
    system("PAUSE");
    return EXIT_SUCCESS;
}



j'aime me parler à moi meme
0
taggle Messages postés 7 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 27 octobre 2009
21 juil. 2009 à 20:42
re salut, mon truc marche avec notepad2 mais pas avec java.exe, je sens que je vais etre obligé d'utiliser tskkill

y'a pas des solutions intermédiaires?
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
22 juil. 2009 à 09:40
Bon déjà, plutôt qu'un utilitaire quelconque, utilise TerminateProcess, avec le handle piProcessInfo.hProcess, avant le CloseHandle.

java.exe... -> Application console ? (javaw.exe pour une application GUI sans console).

Si c'est une appli console, tu peux envoyer un ctrl + C avec GenerateConsoleCtrlEvent. (Mais visiblement faut que l'appli appelante soit console, cf les remarques sur la page.

Si c'est une application GUI, un SendMessage de WM_CLOSE peut fonctionner. Il faut cependant que tu récupères un handle sur la fenêtre. Pour cela il faut énumérer les fenêtres avec EnumWindows, utiliser GetWindowThreadProcessId et comparer le résultat avec ce qu'il y a dans piProcessInfo.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
taggle Messages postés 7 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 27 octobre 2009
24 juil. 2009 à 01:22
merci de ta réponse pour le TerminateProcess je vais essayer quand je retournerais dessus
Donc si j'ai suivi

-piProcessInfo.hProcess ca identifie le procéss lancé?
-CloseHandle(piProcessInfo.hProcess) ca demande gentiement de se fermer?
-terminateProcess ca force la fermeture .
-CloseHandle(piProcessInfo.hThread) ca fait quoi ?


j'utiliser un java pour lancer un .jar
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
24 juil. 2009 à 09:46
CloseHandle ne permet pas de demander la fermeture gentiment. Sous Windows, pour manipuler les objets systèmes (Processus, thread, bitmap, fichier...), on les désigne par leur handle.

Et une fois que l'on a plus besoin de handle, bin faut appeler CloseHandle.
0