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.