AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Kommandozeilen-Programm ausführen, dessen Ausgabe in Listbox
Thema durchsuchen
Ansicht
Themen-Optionen

Kommandozeilen-Programm ausführen, dessen Ausgabe in Listbox

Ein Thema von Hedge · begonnen am 29. Jun 2009 · letzter Beitrag vom 29. Jun 2009
Antwort Antwort
Hedge

Registriert seit: 30. Jun 2007
278 Beiträge
 
Delphi 2009 Professional
 
#1

Kommandozeilen-Programm ausführen, dessen Ausgabe in Listbox

  Alt 29. Jun 2009, 08:58
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.
٩๏̯͡๏)۶
  Mit Zitat antworten Zitat
Highttower

Registriert seit: 2. Jun 2009
Ort: Worms
88 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis

  Alt 29. Jun 2009, 09:10
Guck dir mal das hier an:

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

hth
Tobi
Tobi
Rechtschreib und Semikolion Fehler dürfen behalten werden.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis

  Alt 29. Jun 2009, 10:07
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;
  Mit Zitat antworten Zitat
Hedge

Registriert seit: 30. Jun 2007
278 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis

  Alt 29. Jun 2009, 10:13
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.
٩๏̯͡๏)۶
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis

  Alt 29. Jun 2009, 10:27
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.
  Mit Zitat antworten Zitat
Hedge

Registriert seit: 30. Jun 2007
278 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis

  Alt 29. Jun 2009, 11:25
Huch, hab deinen Beispielaufruf übersehen

CmdLine ist natürlich der Parameter den ich brauche.
٩๏̯͡๏)۶
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz