Developpez.com - Delphi
X

Choisissez d'abord la catégorieensuite la rubrique :

Nono40.developpez.com
Le petit coin du web de Nono40
SOURCES TESTS DELPHI WIN32 AUTOMATISMES DELPHI .NET QUICK-REPORT
Retour à l'accueil
60 - CAPTURE DE L'AFFICHAGE D'UNE FONCTION CONSOLE

PRÉSENTATION : Capture de l'affichage d'une fonction externe en mode console.
ZIP : Téléchargez le zip APERÇUS :

NOTES : Le résultat de la commande est converti en caractères Windows ou lieu de caractères DOS.

CODE :
Unit Unit1;
//
// Sujet : Résultat d'une commande dos dans un Memo
//
// Par Nono40 : http://nono40.developpez.com   http://nono40.fr.st
//              mailTo:nono40@fr.st
//
// Le 13/07/2003
//

Interface

Uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

Type
  TForm1 = Class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    Procedure Button1Click(Sender: TObject);
  Private
    { Déclarations privées }
  Public
    { Déclarations publiques }
  End;

Var
  Form1: TForm1;

Implementation

{$R *.dfm}

Function CommandeConsoleToString(Commande:String):String;
Var  StartInfo    : TStartupInfo;
     ProcessInfo  : TProcessInformation;
     Fin          : Boolean;
     Fichier      : String;
     StdOutFile   : THandle;
     SecurityAttr : TSecurityAttributes;
     Lus          : Cardinal;
     Bloc         : PChar;
     Long         : Cardinal;
Begin
  Result:='';
  { Nom du fichier temporaire }
  Fichier := ExtractFilePath(Application.ExeName)+'_temp_.txt';

  { Création d'un fichier temporaire héritable par le process descendant }
  { Sous W9x ce n'est pas obligatoire mais c'est indispensable pour      }
  { WinNT et supérieur                                                   }
  FillChar (SecurityAttr, SizeOf(SecurityAttr), #0);
  SecurityAttr.nLength              := SizeOf (SecurityAttr);
  SecurityAttr.lpSecurityDescriptor := Nil;
  SecurityAttr.bInheritHandle       := TRUE;
  StdOutFile := CreateFile (PChar(Fichier), GENERIC_READ Or GENERIC_WRITE,
                            FILE_SHARE_READ Or FILE_SHARE_WRITE,
                            @SecurityAttr,
                            CREATE_ALWAYS,
                            FILE_ATTRIBUTE_TEMPORARY Or FILE_FLAG_WRITE_THROUGH, 0);

  Try
    { Mise à zéro de la structure StartInfo }
    FillChar(StartInfo,SizeOf(StartInfo),#0);
    StartInfo.cb          := SizeOf(StartInfo);
    StartInfo.dwFlags     := STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW;
    StartInfo.hStdOutput  := StdOutFile;
    StartInfo.wShowWindow := SW_HIDE;

    { Lancement de la ligne de commande }
    If CreateProcess(Nil, PChar(Commande), NilNil, True,
                  0NilNil, 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;
      { C'est fini }
    End
    Else RaiseLastOSError;
  Finally
    { Avant de lire le fichier on remet le pointeur en début }
    SetFilePointer(StdOutFile,0,Nil,FILE_BEGIN);
    { Création d'un buffer de lecture des données }
    Long := GetFileSize(StdOutFile,Nil);
    GetMem(Bloc,Long+1);
    Bloc[Long]:=#0;
    Try
      { Lecture du fichier de résultat }
      ReadFile(StdOutFile,Bloc^,Long,lus,Nil);
      { Conversion du fichier en caractère Windows au lieu de DOS }
      SetLength(Result,Long);
      OemToCharBuff(Bloc,@Result[1],Long);
    Finally
      FreeMem(Bloc);
    End;
    { Fermeture du fichier temporaire }
    CloseHandle(StdOutFile);
  End;

  { suppression du fichier temporaire }
  DeleteFile(Fichier);
End;


Procedure TForm1.Button1Click(Sender: TObject);
Begin
  Button1.Enabled := False;
  Try
    Memo1.Text:=CommandeConsoleToString(Edit1.Text);
  Finally
    Button1.Enabled := True;
  End;
End;

end.

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2003 Bruno Guérangé. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -