Lancer et arreter un EXE avec ShellExecuteEx

[Résolu]
Signaler
Messages postés
7
Date d'inscription
dimanche 9 mai 2004
Statut
Membre
Dernière intervention
27 octobre 2009
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
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

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
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.
Messages postés
7
Date d'inscription
dimanche 9 mai 2004
Statut
Membre
Dernière intervention
27 octobre 2009

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
Messages postés
7
Date d'inscription
dimanche 9 mai 2004
Statut
Membre
Dernière intervention
27 octobre 2009

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?
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
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.
Messages postés
7
Date d'inscription
dimanche 9 mai 2004
Statut
Membre
Dernière intervention
27 octobre 2009

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
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
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.