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 :

Commande dos depuis delphi


Sujet :

Langage Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Août 2003
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut Commande dos depuis delphi
    Bonjour à tous,


    Je souhaiterai lancer des commande DOS depuis mon application delphi.
    J'utilise code ci-après. La commande se lance bien mais la fenêtre dos ne reste pas affichée à l'écran. Quelqu'un peut il m'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
     
    function ExecuteCommande(Commande: String;Attente : Boolean = True): Boolean;
    Var
      lpsaProcess,
      lpsaThread    : PSecurityAttributes;
      StartupInfo   : TStartupInfo;
      ProcessInfo   : TProcessInformation;
      AddrCmd       : Array [0..255] Of Char;
      ExitCode      : DWord;
    begin
      FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
      with StartupInfo do
      begin
        cb          := SizeOf(TStartupInfo);
        dwFlags     := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
        wShowWindow := SW_HIDE;
      end;
     
      New(lpsaProcess);
      New(lpsaThread);
     
      lpsaProcess^.nLength              := SizeOf(lpsaProcess^);
      lpsaProcess^.lpSecurityDescriptor := Nil;
      lpsaProcess^.bInheritHandle       := True;
     
      lpsaThread^.nLength              := SizeOf(lpsaThread^);
      lpsaThread^.lpSecurityDescriptor := Nil;
      lpsaThread^.bInheritHandle       := True;
     
      StrPCopy(AddrCmd, Commande);
      Result := CreateProcess(nil, AddrCmd, lpsaProcess, lpsaThread, False,
                              STARTF_FORCEONFEEDBACK, nil, nil, StartupInfo, ProcessInfo);
      if not Result then Result:=(GetLastError>10000);
      Dispose(lpsaProcess);
      Dispose(lpsaThread);
      if Result then
      begin
        while Attente do
        begin
          // Attente 500 ms
          //Sleep(500);
          //GetExitCodeProcess(ProcessInfo.hProcess, ExitCode);
          //if ExitCode<>STILL_ACTIVE then break;
     
          // Attente Exit par user 
          WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
     
        end;
        CloseHandle(ProcessInfo.hThread);
        CloseHandle(ProcessInfo.hProcess);
      end;
    end;

    Dans mon application delphi, je lance
    ExecuteCommande('cmd /c "' + Command + '"',true);

    J'ai 2 options d'attente dans le code ci-dessus. L'attente exit par user ne fonctionne pas. Je n'ai plus le curseur et je ne peux pas quitter la fenêtre. PAr contre l'application DOS s'est bien lancée.

    Merci d'avance,
    Wilco

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    AMHA,, tu as la réponse dans les archives du forum et plus précisément ici:
    ShellExecute / CreateProcess / ShellExecuteEx
    --
    Philippe

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Août 2003
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut
    Merci Philippe, c'est ce que j'avais fait. Hélas le code que j'ai repris depuis la FAQ pose le problème que je décris.

    A priori, pour maintenir la fenêtre DOS ouverte jusqu'à ce que l'utilisateur clique pour la fermer impose de faire une boucle d'attente qui prend 100% des ressources CPU. J'avoue ne pas bien comprendre pourquoi il faut faire une boucle d'attente pour conserver cette fenêtre dos ouverte.

    Si quelqu'un a une solution ou peut m'expliquer, je suis preneur.


    Merci d'avance à tous,
    Wilco

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Parceque c'est le fonctionnement du Shell Windows.

    "cmd /k" pour conserver le shell.

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 754
    Points : 13 340
    Points
    13 340
    Par défaut
    Citation Envoyé par Wilco Voir le message
    La commande se lance bien mais la fenêtre dos ne reste pas affichée à l'écran.
    Elle ne devrait même pas apparaître puisque tu spécifies SW_HIDE. De plus le paramètre /C demande à la console de se terminer une fois la commande exécutée

    Citation Envoyé par Wilco Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while Attente do
      WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    Cette boucle ne peut qu'entraîner des problèmes... Remplace-la par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if Result and Attente then
      WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    CreateProcess est une commande assez ancienne. Maintenant, j'utiliserais plutôt ShellExecuteEx.

Discussions similaires

  1. Exécuter une commande DOS
    Par Bourak dans le forum Delphi
    Réponses: 9
    Dernier message: 02/08/2016, 11h15
  2. conversion exécution commande DOS depuis MS SQL Server vers MySQL
    Par Valarauko dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 20/05/2012, 15h06
  3. Exécuter une commande dos depuis TCL
    Par Matmal11 dans le forum Tcl/Tk
    Réponses: 1
    Dernier message: 30/03/2010, 17h19
  4. commande dos sous delphi
    Par Bourak dans le forum Delphi
    Réponses: 3
    Dernier message: 26/06/2007, 15h00
  5. [Système] Commande Dos depuis PHP pour MBSA
    Par enath dans le forum Langage
    Réponses: 1
    Dernier message: 08/06/2007, 11h30

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