DOS-Programm steuern



  • hi
    Wie kann ich die Ausgaben eines DOS-Programms sammeln und das Programm mit Eingaben versorgen?



  • Da kann ich dir nur einen Code in Delphi geben, müsstest du dann als pascalunit einbinden...



  • Na dann zeig mal (die URL), ansonsten wird der Thread nach "WinAPI" verschoben. In der Zwischenzeit kann <newbie> ebendort ja schon mal die Suxchfunktion zum Thema 'pipes' befragen.



  • Ist keine URL hab ich mir selbst gebasterl, bin halt nur ein delphi freak. 🙂

    procedure tTD.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('Fehler!');
        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;
    

    Sollte eigendlich funktionieren, hatte hier schonmal nach der übersetzung feragt konnte, bzw wollte keiner...



  • Das ist ja nur die blanke Prozedur, das lässt sich doch (von einem Nicht-Delphifreak) so nicht im BCB einbinden. Wie wär's mit der kompletten Unit?



  • Ich habe mir gedacht, den header bekommt er schon selber hin. Ansonsten kann er sich ja nochmal melden.


Anmelden zum Antworten