Einzelnen Beitrag anzeigen

Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Tastatureingabe an ein per ShellExe gestartetes Prog. se

  Alt 16. Nov 2007, 16:35
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]
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat