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), Nil, Nil, True,
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;
{ 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.
|