Bonjour,

Avec CreateProcess, je dois exécuter plusieurs actions sur un exécutable sur lequel je dois passer des paramètres.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
MonEXE "Source" "Destination"
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

J'ai bien vérifié, dans sParams, j'ai mes deux paramètres.



Ci dessous mon code

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;
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
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;
2em soucis (toujours avec CreateProcess), dans la fonction ExecuteAndWait, je n'ai pas le retour des erreurs que l'application devrait me retourner.

Merci