Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#3

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

  Alt 29. Jun 2009, 11: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