Registriert seit: 5. Mai 2006
Ort: Velbert
246 Beiträge
Delphi 2006 Professional
|
Re: CreateProcess startet meine Anwendung nicht
22. Jul 2008, 06:38
Hallo,
danke für die vielen Tipps.
ich habe es jetzt wie folgt realisiert und es klappt.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
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;
pAppStr : PAnsiChar;
begin
// AnwendungsString zusammenbauen
pAppStr := pchar('"' + ed_app.text + '" "' + ed_para.text + '"');
FillChar(StartStruct, SizeOf(StartStruct), #0);
StartStruct.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
StartStruct.wShowWindow := SW_MAXIMIZE;
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
if (CreateProcess(
nil, { LPCTSTR - lpApplicationName }
pAppStr, { LPTSTR - lpCommandLine }
nil, { LPSECURITY_ATTRIBUTES - lpProcessAttributes }
nil, { LPSECURITY_ATTRIBUTES - lpThreadAttributes }
true, { BOOL - bInheritHandles }
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, { DWORD - dwCreationFlags }
nil, { LPVOID - lpEnvironment }
nil, { LPCTSTR - lpCurrentDirectory }
StartStruct, { LPSTARTUPINFO - lpStartupInfo }
ProcInfo { LPPROCESS_INFORMATION - lpProcessInformation }
)) then
begin
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);
end
else
begin
MessageDlg('Die Anwendung konnte nicht gestartet werden', mtError, [mbOk], 0, mbOk);
end;
end;
Nun werder ich mich mal mit "ReadFile/WriteFile" beschäftigen.
Gruß Holger.
Holger Glück findet sich nicht im Code
Gefahren werden ist nur solange schön wie man selbst nicht lenken möchte ...
|
|
Zitat
|