Die klassische Variante verwendet CreateProcess und umgeleiteten Input und Output. Da ich heute in geduldiger Stimmung bin, gibt es die Gebrauchsanweisung frei Haus:
Delphi-Quellcode:
var StartStruct: STARTUPINFO; //Anweisungen für den Prozess-Start
ProcInfo: PROCESS_INFORMATION; //das kriegen wir zurück
WriteInput, ReadOutput: THandle; //hierüber können wir mit dem Prozess kommunizieren
SecAttr: SECURITY_ATTRIBUTES; //hiermit sagen wir, dass die Handles vererbbar werden sollen
ZeroMemory(@StartStruct, Sizeof(StartStruct));
StartStruct.cb:=SizeOf(StartStruct); //Die Größenangabe muss stimmen!
StartStruct.dwFlags:=STARTF_USESTDHANDLES; // Wir wollen die Standard-Handles umleiten
SecAttr.nLength := SizeOf(SecAttr);
SecAttr.lpSecurityDescriptor := nil; //Standard-Sicherheit
SecAttr.bInheritHandle := True; //vererbbar
CreatePipe(ReadOutput, StartStruct.hStdOutput, @SecAttr, 0);
CreatePipe(StartStruct.hStdInput, WriteInput, @SecAttr, 0); //die Handles erzeugen
CreateProcess('AppName', 'Commandline', nil, nil, true, 0 {oder CREATE_NEW_CONSOLE}, nil, nil, StartStruct, ProcInfo);
CloseHandle(StartStruct.hStdOutput);
CloseHandle(StartStruct.hStdInput);
CloseHandle(ProcInfo.hProcess); //Nur falls du das Prozesshandle nicht brauchst
CloseHandle(ProcInfo.hThread);
//jetzt mit ReadFile/WriteFile kommunizieren
CloseHandle(WriteInput);
CloseHandle(ReadOutput);
Mit den Parametern von CreateProcess kannst du ein bisschen experimentieren, da gibt es ziemlich viele Möglichkeiten. Auch die Felder in STARTUPINFO bieten einige Optionen, z.B. ob der Prozess versteckt gestartet werden soll. Insgesamt kann ich dir nur die
MSDN ans Herz legen.
[edit=Sharky]Auf Wunsch von Apollonius habe ich den Quellcode heute durch eine "fehlerfreie" Version ersetzt. Mfg, Sharky[/edit]