Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Kommandozeilen-Programm ausführen, dessen Ausgabe in Listbox (https://www.delphipraxis.net/136357-kommandozeilen-programm-ausfuehren-dessen-ausgabe-listbox.html)

Hedge 29. Jun 2009 08:58


Kommandozeilen-Programm ausführen, dessen Ausgabe in Listbox
 
Ich möchte aus Delphi heraus ein Kommandozeilenprogramm aufrufen und dessen Ausgabe in eine Listbox in meinem Programm anzeigen.

Wie macht man das?
ShellExecute scheint wohl nicht das Allheilmittel zu sein für solche Aufgaben.

Highttower 29. Jun 2009 09:10

Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis
 
Guck dir mal das hier an:

MSDN-Library durchsuchenCreateNamedPipe, MSDN-Library durchsuchenTransactNamedPipe, MSDN-Library durchsuchenConnectNamedPipe

hth
Tobi

Popov 29. Jun 2009 10:07

Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis
 
Ich weiß nicht von wem der Code ist, ob von mir oder aus dem Internat, aber ich hab den schon ewig. Sollte ein Programmierer seine Funktion erkennen, dann soll er sich melden und ich trage die Credits nach.

Der Code besteht aus zwei Teilen, der eigentlichen Funktion und einem Beispielaufruf.

Delphi-Quellcode:
function RunCaptured(const _dirName, _exeName, _cmdLine: string): String;
var
  TmpName: string;
  TmpSec: TSecurityAttributes;
  Tmp: Windows.THandle;
  Start: TStartupInfo;
  ProcInfo: TProcessInformation;
  Res: TStringList;
  Return: Cardinal;
begin
  try
    TmpName := 'Test.tmp';
    FillChar(TmpSec, SizeOf(TmpSec), #0);
    TmpSec.nLength := SizeOf(TmpSec);
    TmpSec.bInheritHandle := True;

    Tmp := Windows.CreateFile(PChar(TmpName),
           Generic_Write, File_Share_Write,
           @TmpSec, Create_Always, File_Attribute_Normal, 0);

    try
      FillChar(Start, SizeOf(Start), #0);
      Start.cb         := SizeOf(Start);
      Start.hStdOutput := Tmp;
      Start.dwFlags    := StartF_UseStdHandles or StartF_UseShowWindow;
      Start.wShowWindow := SW_Minimize;

      if CreateProcess(nil, PChar(_exeName + ' ' + _cmdLine), nil, nil, True,  
                       0, nil, PChar(_dirName), Start, procInfo) then
      begin
        SetPriorityClass(ProcInfo.hProcess, Idle_Priority_Class);
        WaitForSingleObject(ProcInfo.hProcess, Infinite);
        GetExitCodeProcess(ProcInfo.hProcess, Return);
        CloseHandle(ProcInfo.hThread);
        CloseHandle(ProcInfo.hProcess);
        Windows.CloseHandle(Tmp);
        Res := TStringList.Create;
        try
          Res.LoadFromFile(TmpName);
          Result := Res.Text;
        finally
          Res.Free;
        end;

        Windows.DeleteFile(PChar(TmpName));
      end  
        else
      begin
        Application.MessageBox(PChar(SysErrorMessage(GetLastError())),
          'RunCaptured Error', MB_OK);
      end;

    except
      Windows.CloseHandle(tmp);
      Windows.DeleteFile(PChar(tmpName));
      raise;
    end;  
  finally {} end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  sl: TStringlist;
  i: Integer;
  s: String;
begin
  s := RunCaptured('C:\', 'ipconfig.exe', '/all');
  s := Trim(s);

  sl := TStringList.Create;
  try
  begin
    sl.Text := s;
    { Leerzeilen entfernen }
    for i := sl.Count -1 downto 0 do
    begin
      if sl.Strings[i] = '' then sl.Delete(i);
    end; {}
    s := sl.Text;
  end;
  finally
    sl.Free;
  end;
  //ASCII2Ansi(s);
  ListBox1.Items.Text := s;
end;

Hedge 29. Jun 2009 10:13

Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis
 
danke an euch beide.
Die Funktion ist ja super popov :)
Genau das was ich brauche.

Kann man in _exeName direkt Parameter für den Exe-Aufruf mit angeben?

Müsste laut MSDN der Fall sein.

Popov 29. Jun 2009 10:27

Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis
 
Meine Erfahrungen mit Command Befehlen ist (nicht hier speziell, sondern allgemein), daß man immer schön die Befehle und Parameter trennen sollte. Versuche es, wundere dich aber nicht.

Hedge 29. Jun 2009 11:25

Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis
 
Huch, hab deinen Beispielaufruf übersehen :)

CmdLine ist natürlich der Parameter den ich brauche.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz