Thema: Delphi Dos-Programm öffnen

Einzelnen Beitrag anzeigen

Gast
(Gast)

n/a Beiträge
 
#8
  Alt 16. Jan 2003, 19:16
Willst du eine Nachricht empfange vom Dos, oder nur eine bestätigung ob das programm beendet wurde, ich kann dir geben, das du das im tmemo stehen hast, was im dos steht.

Das ist eigendlich ganz einfach:

Delphi-Quellcode:
procedure CaptureDos(command:String;Stringsp:TStrings);
const
  CaptureBufferSize = 2500;
var
  SecAttrib : TSecurityAttributes;
  ReadPipe,writePipe : THandle;
  Startup : TStartUpInfo;
  ProcessInfo : TProcessInformation;
  CaptureBuffer : Pchar;
  BytesRead : DWord;
  WaitHandle : DWord;
begin
  Stringsp.clear;
 Stringsp.add('Starte "'+command+'"');
  With SecAttrib do
  begin
    nlength := SizeOf(TSecurityAttributes);
    binherithandle := true;
    lpsecuritydescriptor := nil;
  end;
  if Createpipe (ReadPipe, writePipe, @SecAttrib, 0) then
  begin
    CaptureBuffer := AllocMem(CaptureBufferSize + 1);
    FillChar(Startup,Sizeof(Startup),#0);
    Startup.cb := SizeOf(Startup);
    Startup.hStdOutput := writePipe;
    Startup.hStdInput := ReadPipe;
    Startup.dwFlags := STARTF_USESTDHANDLES +
                           STARTF_USESHOWWINDOW;
    Startup.wShowWindow := SW_SHOW;

    if CreateProcess(nil,
      PChar(command),
      @SecAttrib,
      @SecAttrib,
      true,
      NORMAL_PRIORITY_CLASS,
      nil,
      nil,
      Startup,
      ProcessInfo) then
    begin
      repeat
        WaitHandle := WaitForSingleObject( ProcessInfo.hProcess,100);
        Application.ProcessMessages;
      until (WaitHandle <> WAIT_TIMEOUT) or application.terminated;
      if not application.terminated then
      Repeat
        BytesRead := 0;
        ReadFile(ReadPipe,CaptureBuffer[0],CaptureBufferSize,BytesRead,nil);
        CaptureBuffer[BytesRead]:= #0;
        OemToAnsi(CaptureBuffer,CaptureBuffer);
        Stringsp.Text := Stringsp.Text+String(CaptureBuffer);
      until (BytesRead < CaptureBufferSize);
      end else Stringsp.add('Fehler!');
    FreeMem(CaptureBuffer);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ReadPipe);
    CloseHandle(writePipe);
  end else Stringsp.add('Konnte Dos Kommando nicht starten, Fehler: #'+
  inttostr(getlasterror));
end;
Um die prozedur auszuführen, benutzt du z.B.
procedure CaptureDos('dir c:',Memo1->Lines);

dann bekommste dein dos komando.

[keine garantie, habe ich aus c++ übersetzt...]

Falls ein fehler auftreten sollte, bitte melden!
  Mit Zitat antworten Zitat