Hallo
Ich habe auch mal wieder ein Problem
Ich habe in den letzten Stunden die frei verfügbare
Unit RedirectConsole.pas
versucht für objektorientieren Einsatz umzuschreiben, aber auch versucht den größten Teil der
Unit zu übernehmen und die Struktur zu erhalten.
Die
Unit leitet Ein- und Ausgaben in/aus der Eingabeaufforderung (cmd.exe Prozess) in/aus Delphi um. Problem ist die Schleife (repeat-until) im Originalcode, die ich in der Konsole so nicht einsetzen kann/will.
Also habe ich es in eine Klasse umgeschrieben:
Delphi-Quellcode:
Type
TSysCmd = Class
Public
Constructor Create(pCmdDatei, pErrorStr, pStartOrdner : String);
Procedure SendeZeile(pZeile : String);
Var RC_LineOut: procedure(s: string);
hBufferWarteZeit : Integer;
Destructor Free();
Private
Function IstWinNT : BOOLEAN;
Procedure TeileZeilen(pText : String);
const bufsize=1024; // 1KByte Buffer
Var
buf: array [0..bufsize-1] of AnsiChar; // Musste ich ändern von Char sonst falsche Zeichen
si: tSTARTUPINFO;
sd: tSECURITYDESCRIPTOR;
pi: tPROCESSINFORMATION;
newstdin, newstdout, read_stdout, write_stdin: tHandle;
bread, avail: dword;
Const
CRLF=#13#10;
Var
RC_SendBuf: string;
RC_End: Boolean;
RC_ExitCode: Cardinal;
End;
Im Create erzeuge ich die Prozessinstanz (cmd.exe) und versorge sie dann in SendeZeile mit Eingabe und ließ in der selben Methode nach kurzem warten (hBufferWarteZeit=200ms) den Buffer aus und leite es über RC_LineOut an meine Konsole weiter.
Eingebunden in ein
VCL Programm funktioniert das ganze auch perfekt, wenn ich das Objekt aber in einer Konsole erstelle dann wird cmd.exe garnicht erst erzeugt, weiß jemand warum?
Das Hauptprogramm ist
//{$APPTYPE CONSOLE}
weil ich es über lokale ressourcen steuere.
Hier noch der CreateProcess-Block:
Delphi-Quellcode:
GetStartupInfo(si);
si.dwFlags:=STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
si.wShowWindow:=SW_HIDE;
si.hStdOutput:=newstdout;
si.hStdError:=newstdout;
si.hStdInput:=newstdin;
if not CreateProcess(pchar(pCmdDatei), nil, nil, nil, true,
CREATE_NEW_CONSOLE, nil, nil {pChar(lStartOrdner)}, si, pi) then begin
pErrorStr := 'OnCreate(SysCmd) - Fehler bei der Erstellung des Prozess "' + pCmdDatei + '"';
CloseHandle(newstdin);
CloseHandle(newstdout);
CloseHandle(read_stdout);
CloseHandle(write_stdin);
exit;
end;
Wäre echt nett wenn mir jemand das mal erklären könnte
Gruß !N