Récupérer le code retour d'un exe lancer par CreateProcess [Résolu]

Signaler
Messages postés
90
Date d'inscription
mardi 28 octobre 2003
Statut
Membre
Dernière intervention
24 avril 2008
-
Messages postés
3815
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
4 août 2020
-
bonjour,
depuis une application Delphi, je lance un exécutable C++avec un fichier de données comme paramètr. Cet exe C++ retourne un entier qui permet de savoir si l'exécution s'est bien déroulée ou non (-1 : OK, sinon un nombre entier )

J'aimerais récupérer ce code retour dans mon code delphi pour traiter ensuite les erreurs potentielles.

comment faire?

merci beaucoup

CI-joint mon code delphi :
var
{ Variables liées à l'exécution d'un exécutable externe }
StartInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
Fin: Boolean;
processALancer: string;


lpExitCode: Longword;
{Fin Variables liées à l'exécution d'un exécutable externe }

begin
...
{ Mise à zéro de la structure StartInfo }
FillChar(StartInfo, SizeOf(StartInfo), #0);


{ Seule la taille est renseignée, toutes les autres options }
{ laissées à zéro prendront les valeurs par défaut }
StartInfo.cb := SizeOf(StartInfo);


processALancer := nomPathExe + nomModelExe + ' ' + nomFichierSelectionne;

{ Permet de cacher l'application externe appelée}
StartInfo.dwFlags:=STARTF_USESHOWWINDOW;
StartInfo.wShowWindow:=SW_HIDE;

{ Lancement de la ligne de commande }
if CreateProcess(nil, PAnsiChar(processALancer), nil, nil, False,
0, nil, nil, StartInfo, ProcessInfo) then
begin
// L'application est bien lancée, on va en attendre la fin
// ProcessInfo.hProcess contient le handle du process principal de l'application
Fin := False;
repeat
// On attend la fin de l'application
case WaitForSingleObject(ProcessInfo.hProcess, 200) of
WAIT_OBJECT_0: Fin := True; // L'application est terminée, on sort
WAIT_TIMEOUT: ; // elle n'est pas terminée, on continue d'attendre
end;
// Mise à jour de la fenêtre pour que l'application ne paraisse pas bloquée.
Application.ProcessMessages;
until Fin;
end
else RaiseLastOSError;
end;

1 réponse

Messages postés
3815
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
4 août 2020
35
Salut,
j'ai fait quelques testes et voici ce que j'ai trouvé :

Var lpExitCode : Cardinal

WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
// avant de refermer les handles ce que normalement tu devrais faire
// tu utilises la fonction GetExitCodeProcess
GetExitCodeProcess(ProcessInformation.hProcess, lpExitCode);
CloseHandle( ProcessInformation.hProcess );
CloseHandle( ProcessInformation.hThread );
// exemple pour afficher le résultat
Form1.Label1.Caption := IntToStr(lpExitCode);

j'ai fait un prog que je termine soit par halt(0) où halt(1) où halt(2) et j'ai à chaques fois j'ai récuperé le code de sortie.
Mais avec un code de sortie = à -1 je ne sais pas si ça fonctionne puisque halt n'accepte que des valeurs positives

@+
Cirec