Announcement

Collapse
No announcement yet.

CMD einbinden! Ansehen, bitte!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • CMD einbinden! Ansehen, bitte!

    Hallo,
    kann mir jemand helfen? Ich habe ein Problem mit dem Code: Ich habe
    den Code so wie er unten ist eingegeben und der Code geht so:
    Man braucht eine Memo-Komponente und einen Button. Wenn man auf den
    Button klickt, wird die Eingabeaufforderung von Windows umgeleitet
    in das Memofeld. ABER: Es wird in dem Memofeld nicht der Vorgang angezeigt
    sondern nur das, wenn es abgeschlossen ist. Z. B. wenn ich bei dem
    Button '/c format C:' eingebe, dann steht nichts da. Ich möchte
    aber die ganze Eingabeaufforderung in dem Memofeld anzeigen. So dass
    ich in das Memofeld wie die Eingabeaufforderung etwas eingeben kann,
    oder habt ihr eine andere Idee????

    Danke

    Tobias

    --------------------------------------------------------------------------

    procedure CaptureDosCmd(command:String;OutputMemo:TMemo);

    const

    CaptureBufferSize = 2500;

    var

    SecAttrib : TSecurityAttributes;

    ReadPipe,writePipe: THandle;

    Startup : TStartUpInfo;

    ProcessInfo : TProcessInformation;

    CaptureBuffer : Pchar;

    BytesRead : DWord;

    WaitHandle : DWord;

    begin

    OutPutMemo.Lines.clear;

    OutputMemo.lines.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_HIDE;

    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);

    OutputMemo.Text := OutputMemo.Text+String(CaptureBuffer);

    until (BytesRead < CaptureBufferSize);

    end else OutPutMemo.lines.add('Operation wurde abgebrochen!');

    FreeMem(CaptureBuffer);

    CloseHandle(ProcessInfo.hProcess);

    CloseHandle(ProcessInfo.hThread);

    CloseHandle(ReadPipe);

    CloseHandle(writePipe);

    end else OutPutMemo.lines.add('Konnte Kommando nicht starten, Fehler:

    #'+

    inttostr(getlasterror));

    end;

    procedure TForm2.FormActivate(Sender: TObject);

    var

    cmd : array[0..255] of char;

    par : array[0..255] of char;

    begin

    getEnvironmentVariable('COMSPEC', cmd, 255);

    // getEnvironmentVariable('WINDIR', par, 255);

    par := '';

    CaptureDosCmd(cmd + ' /c dir' + par, Memo1);

    end;
Working...
X