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

Delphi Discussion :

Executer une ligne de commande ET recuperer valeur retour


Sujet :

Delphi

  1. #1
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut Executer une ligne de commande ET recuperer valeur retour
    Bonjour,

    Je dois executer depuis une dll ISAPI (dll servant de site web) un programme exe qui fonctionne sous forme de ligne de commande à savoir sans aucune interface graphique. Je dois par ailleurs (et c'est ce qui me pose le plus de problème) récuperer la valeur qu'il me retourne.

    Je ne connais pas les sources de cet exe, je sais juste les parametres à lui fournir ainsi que la forme de la valeur de retour.

    Pour info, cet exe est fourni par la Société Générale (sogenactif) afin de faire du payement en ligne.

    J'ai essayé avec ShellExecute mais impossible de recuperer la valeur de retour (a par un code 42...). J'ai penser aussi à passer par un fichier buffer mais cela pose des problemes de conflits si 2 processus écrivent dans ce fichier (meme l'un apres l'autre), j'aurai l'un ou les 2 retour qui sera éffacé. Cela fait au moins 1h que je cherche avec un collegue sur internet mais aucune trace d'informations. Il y a bien eu une personne ici qui à dit avoir résolu son problème mais n'a pas expliquer sa démarche...

    Je vous remercie

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut
    Ta valeur de retour est elle stockée dans un fichier ou sort elle dans la fenêtre DOS ?
    Voilà un exemple qui peut t'aider
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
      procedure RunDosInMemo(DosApp:String;AMemo:TMemo) ;
      const
         ReadBuffer = 2400;
      var
       Security : TSecurityAttributes ;
       ReadPipe,WritePipe : THandle;
       start : TStartUpInfo;
       ProcessInfo : TProcessInformation;
       Buffer : Pchar;
       BytesRead : DWord;
       Apprunning : DWord;
      begin
       With Security do begin
        nlength := SizeOf(TSecurityAttributes) ;
        binherithandle := true;
        lpsecuritydescriptor := nil;
       end;
       if Createpipe (ReadPipe, WritePipe,
                      @Security, 0) then
       begin
        Buffer := AllocMem(ReadBuffer + 1) ;
        FillChar(Start,Sizeof(Start),#0) ;
        start.cb := SizeOf(start) ;
        start.hStdOutput := WritePipe;
        start.hStdInput := ReadPipe;
        start.dwFlags := STARTF_USESTDHANDLES +
                             STARTF_USESHOWWINDOW;
        start.wShowWindow := SW_HIDE;
     
        if CreateProcess(nil,
               PChar(DosApp),
               @Security,
               @Security,
               true,
               NORMAL_PRIORITY_CLASS,
               nil,
               nil,
               start,
               ProcessInfo)
        then
        begin
         repeat
          Apprunning := WaitForSingleObject
                       (ProcessInfo.hProcess,100) ;
          Application.ProcessMessages;
         until (Apprunning <> WAIT_TIMEOUT) ;
          Repeat
            BytesRead := 0;
            ReadFile(ReadPipe,Buffer[0],
    ReadBuffer,BytesRead,nil) ;
            Buffer[BytesRead]:= #0;
            OemToAnsi(Buffer,Buffer) ;
            AMemo.Text := AMemo.text + String(Buffer) ;
          until (BytesRead < ReadBuffer) ;
       end;
       FreeMem(Buffer) ;
       CloseHandle(ProcessInfo.hProcess) ;
       CloseHandle(ProcessInfo.hThread) ;
       CloseHandle(ReadPipe) ;
       CloseHandle(WritePipe) ;
       end;
      end;

  3. #3
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Le principe est je l'appel et elle me retourne la valeur de retour donc sous une fenetre dos, j'ai la valeur directement.

    Le fichier c'etait sous la forme Unix
    mais ça pose des problemes.

    Merci pour ton programme je regarde si ça correspond à ce que je recherche.

  4. #4
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Merci, c'est tout à fait ce que je cherchai ^^
    J'ai du modifier un tout petit peu car comme mon application est une dll, je n'ai pas de TMemo.
    Voici la version modifiée
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    procedure TWebModule1.RunDos(DosApp: String; var Result: String);
    const
      ReadBuffer = 2400;
    var
      Security : TSecurityAttributes;
      ReadPipe,WritePipe : THandle;
      start : TStartUpInfo;
      ProcessInfo : TProcessInformation;
      Buffer : Pchar;
      BytesRead : DWord;
      Apprunning : DWord;
    begin
      With Security do begin
        nlength := SizeOf(TSecurityAttributes) ;
        binherithandle := true;
        lpsecuritydescriptor := nil;
      end;
     
      if Createpipe (ReadPipe, WritePipe, @Security, 0) then
      begin
        Buffer := AllocMem(ReadBuffer + 1) ;
        FillChar(Start,Sizeof(Start),#0) ;
        start.cb := SizeOf(start) ;
        start.hStdOutput := WritePipe;
        start.hStdInput := ReadPipe;
        start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
        start.wShowWindow := SW_HIDE;
     
        if CreateProcess(nil, PChar(DosApp), @Security, @Security, true, NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo) then
        begin
          Repeat
            Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100);
            Application.ProcessMessages;
          until (Apprunning <> WAIT_TIMEOUT);
     
          Repeat
            BytesRead := 0;
            ReadFile(ReadPipe,Buffer[0], ReadBuffer,BytesRead,nil);
            Buffer[BytesRead]:= #0;
            OemToAnsi(Buffer,Buffer);
            Result := Result + String(Buffer);
          until (BytesRead < ReadBuffer);
        end;
     
        FreeMem(Buffer);
        CloseHandle(ProcessInfo.hProcess);
        CloseHandle(ProcessInfo.hThread);
        CloseHandle(ReadPipe);
        CloseHandle(WritePipe);
      end;
    end;
    Dans les uses, il faut ajouter (si ils ny sont pas) :

  5. #5
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut
    Parfait ! Bonne continuation.

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

Discussions similaires

  1. Executer une ligne de commande
    Par Kishikage dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 31/01/2013, 20h42
  2. Réponses: 6
    Dernier message: 12/05/2008, 11h22
  3. executer une ligne de commande
    Par sebgaillard dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 17/04/2008, 17h05
  4. [Runtime] executer une ligne de commande cmd à partir de java
    Par mazizou dans le forum API standards et tierces
    Réponses: 13
    Dernier message: 10/05/2007, 13h47
  5. Réponses: 1
    Dernier message: 27/04/2007, 19h59

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