IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

CreateProcess à false lors de son appel


Sujet :

Langage Delphi

  1. #1
    Membre habitué

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 194
    Points : 127
    Points
    127
    Par défaut CreateProcess à false lors de son appel
    Bonjour à tous,
    Aujourd'hui je suis confronté à une erreur dans l'appel de la commande CreateProcess, mais je ne vois pas où peut être cette erreur.
    Je souhaite utiliser cette fonction pour appeler une procédure en VBS servant à transformer un fichier Excel en CSV et continuer mon programme quand le process est terminé.
    (procédure VBS trouvée ICI)

    L'appel de CreateProcess renvoie false, et donc le programme ne passe jamais par le code si le résultat est true
    Est ce que j'ai mal saisi un truc ?
    Bien entendu, je me suis servi de beaucoup d'exemple mais là, je ne vois rien ...
    Pouvez vous m'aider ?

    Voici 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
    procedure TForm1.BitBtn9Click(Sender: TObject);
    Var
        StartInfo: TStartupInfo;
        ProcInfo: TProcessInformation;
    begin
            if ContainsText(Extention,'XLS') then
            begin
               if FileExists(IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName))+'ExcelToCSV.vbs') then
               begin
                  ShowMessage('Le fichier sera converti en format CSV et rapatrié.');
                  FillChar(StartInfo,SizeOf(TStartupInfo),#0) ;
                  FillChar(ProcInfo,SizeOf(TProcessInformation),#0) ;
                  StartInfo.cb := SizeOf(TStartupInfo);
     
                  // Avec CreateProcess, on a un descripteur de processus et avec WaitForSingleObject, on vérifie quand le processus est terminé.
                  if CreateProcess(PChar(IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName))+'ExcelToCSV.vbs'),
                                   PChar('"'+Fichier+'" "'+Fichier+'.csv"'), nil,nil, true, 0, nil, PChar(nil), StartInfo, ProcInfo) then
                  begin
                    // loop every 10 ms
    //                 while WaitForSingleObject(ProcInfo.hProcess, 10) > 0 do
    //                begin
    //                  Application.ProcessMessages;
    //                end;
                    WaitForSingleObject(ProcInfo.hProcess,INFINITE);
                    CloseHandle(ProcInfo.hProcess);
                    CloseHandle(ProcInfo.hThread);
                  end;
                  ...//... suite du code
             end;
          end;
    end; 
     
     
    En vous remerciant par avance pour toute votre aide.

  2. #2
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 073
    Points
    1 073
    Par défaut
    Bonjour,

    tu devrais essayer comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
      if CreateProcess( nil,
                        PChar('"'+ExtractFilePath(Application.ExeName)+'ExcelToCSV.vbs" "'+Fichier+'" "'+Fichier+'.csv"'),
                        nil,nil, true, 0, nil, nil, StartInfo, ProcInfo) then
    ps:
    ExtractFilePath laisse toujours un backslash à la fin
    contrairement à
    ExtractFileDir
    et si le chemin contient des espaces il faut également le placer entre guillemets

    Cordialement,
    @+

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 665
    Points : 25 458
    Points
    25 458
    Par défaut
    Pourquoi ne pas plutôt traduire le VBS qui n'est qu'une utilisation de Excel en OLE ce qui est faisable en Delphi

    D'ailleurs, j'ai le code CSV vers Excel

    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
           ExcelOle := CreateOleObject('Excel.Application');
           try
             ExcelOle.Visible := False;
             ExcelOle.WorkBooks.Open(NomDuFichierTemporaire);
             ExcelOle.WorkBooks[1].WorkSheets[1].Name := 'Nom de la Page';
     
             ExcelOle.Cells.Select;
             ExcelOle.Selection.Columns.AutoFit;
             ExcelOle.Cells[1, 1].Select;
     
             ExcelOle.ActiveWorkBook.SaveAs(Filename := NomDuFichierDefinitif, FileFormat := -4143); // Convertit CSV en Excel        
             DeleteFile(NomDuFichierTemporaire);
     
          finally
             ExcelOle.Visible := True;
             ExcelOle.UserControl := True;
             ExcelOle := Unassigned;
          end;


    Sinon, ShellExecute pour lancer un VBS serait plus pertinent et bien plus simple qu'un CreateProcess sauf si l'on souhaite attendre l'opération.
    Dans ce CreateProcess lui doit être fait sur cscript.exe qui prend en paramètre le nom du fichier VBS

  4. #4
    Membre habitué

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 194
    Points : 127
    Points
    127
    Par défaut
    J'ai abandonné ShellExecute car justement, je souhaite attendre la fin du script avant de continuer.

    Bon, j'ai essayé le pilotage OLE, qui est effectivement plus intégrée qu'un fichier externe. Tout ce passe bien, j'ai juste modifié le format de sortie à 6 au lieu de -4143

    Je reviendrai sur le CreateProcess qui ne lançait toujours pas le script malgré la correction ... en prenant en compte la remarque de ShaiLeTroll sur cscript.exe que je ne connais pas.
    Tout ce passe bien avec ShellExecute (mais sans contrôle de fin de processus)

    Merci à vous 2, j'avance, j'avance ... pas toujours très vite ...

    Je mets résolu, de déterrerai plus tard ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/09/2012, 15h04
  2. Un processus qui ralenti lors de son second appel
    Par maccormick dans le forum Général Java
    Réponses: 17
    Dernier message: 29/06/2011, 12h30
  3. Problème lors de l'appel à CreateProcess
    Par theawe dans le forum Langage
    Réponses: 4
    Dernier message: 16/07/2009, 09h12
  4. Réponses: 1
    Dernier message: 27/09/2006, 16h48
  5. Réponses: 5
    Dernier message: 31/07/2006, 10h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo