Bonjour,
Avec CreateProcess, je dois exécuter plusieurs actions sur un exécutable sur lequel je dois passer des paramètres.
Un des problèmes c'est que seul le dernier paramètre est pris en compte et pas le premier, ce qui fait que mon application ne fait pas ce qu'elle doit faire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 MonEXE "Source" "Destination"
J'ai bien vérifié, dans sParams, j'ai mes deux paramètres.
Ci dessous mon code
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 function ConvertTbHF(ListTbHF : TListTableHF;ProgressBar : TProgressBar;Memo : TMemo) : Boolean; var i : integer; sDestName : String; sTableName : String; sTmp : String; sParams : String; begin Result := False; for i := 0 to ListTbHF.Count - 1 do begin sTableName := ListTbHF.Items[i].TableName + '.fic'; sDestName := ListTbHF.Items[i].TableName + '.xml'; sTmp := 'Convertion : ' + ListTbHF.Items[i].TableName; sParams := AnsiQuotedStr(GPATHSOURCE + sTableName,'"') + #32 + AnsiQuotedStr(GPATHFILETMP + sDestName,'"'); case ExecuteAndWait(GFILEHFTOXML,sParams) of CRESULTOK: begin AddToMemo(Memo, sTmp + ' >> OK'); Result := True; end; CFILENOTFOUND : AddToMemo(Memo,sTmp + ' >> Fichier non trouvé'); CHFERROR : AddToMemo(Memo,sTmp + ' >> Impossible de convertir la table'); CCANNOTOPENHF : AddToMemo(Memo,sTmp + ' >> Erreur d''ouverture de la table'); CCONVERTERROR : AddToMemo(Memo,sTmp + ' >> Erreur lors de la convertion'); else begin AddToMemo(Memo,sTmp + ' >> Erreur inconnue'); Result := False; end; end; ProgressBar.Position := i * 100 Div (ListTbHF.Count - 1); Application.ProcessMessages; end; end;
2em soucis (toujours avec CreateProcess), dans la fonction ExecuteAndWait, je n'ai pas le retour des erreurs que l'application devrait me retourner.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 function ExecuteAndWait (sExeName : String;Param : String) : Integer; Var StartInfo : TStartupInfo; ProcessInfo : TProcessInformation; Fin : Boolean; ExitCode : Cardinal; begin Result := -1; { 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); { Lancement de la ligne de commande } If CreateProcess(PChar(sExeName),PChar(Param) ,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; GetExitCodeProcess(ProcessInfo.hProcess,ExitCode); Result := ExitCode; { C'est fini } End Else RaiseLastOSError; end;
Merci
Partager