![]() |
WaitForSingleObject und Child-Prozesse
Hallo Ihr,
ich hab das Problem, dass das Ende einer über CreateProcess gestarteten InstallShield-Installation nicht über WaitForSingleObject abgefragt werden kann. Das gestartete (und eigentlich zu überwachende) setup.exe startet seinerseits einen Prozess und wird danach direkt beendet. :( Somit ist aus Sicht von WaitForSingleObject der gestartete und zu beobachtende Prozess beendet - aber nicht jedoch die eigentliche Installation. Gibt es eine Möglichkeit auch auf das Ende des von setup.exe gestarteten Prozesses zu warten bzw. das zu prüfen? Gruss nru |
AW: WaitForSingleObject und Child-Prozesse
Moin nru,
meiner Erfahrung nach hat der von einem InstallShield so erzeugte neu erzeugte Prozess immer den gleichen Namen (ggf. ändert sich dieser nur in Abhängigkeit des Programmes, dass installiert werden soll). Du könntest also mit CreateToolhelp32Snapshot überwachen, ob der abgespaltene Prozess existiert. |
AW: WaitForSingleObject und Child-Prozesse
Man könnte auch versuchen die Erstellungsfunktion für den Subprozess zu hooken und würde somit an das gewünschte Prozesshandle bekommen.
Aber bei einem Setup könnte es schwierig werden, wenn dieses mit Adminrechten startet und der eigene Prozess keine besitzt. |
AW: WaitForSingleObject und Child-Prozesse
Wenns ohne Code Injection oder Treiber gehen soll:
|
AW: WaitForSingleObject und Child-Prozesse
Ich weiß nicht...laut MSDN funktioniert WaitForSingleObject nicht wenn weitere fenster aus dem prozess
heraus entstehen... Sprich ich hatte so ein ähnliches Problem hier ![]() Die Lösung war damals WaitForMultipleObjects
Delphi-Quellcode:
function ExecAndWait(Filename, Params: string; WindowState: word = SW_SHOWNORMAL): boolean;
var ShExecInfo: SHELLEXECUTEINFO; r : Cardinal; const SEE_MASK_NOASYNC= $100; begin Result := false; if Filename = '' then exit; if not FileExists(FileName) then Begin ShowMessage('Datei nicht existent!'); Exit; End; ZeroMemory(@ShExecInfo, SizeOf(ShExecInfo)); ShExecInfo.Wnd := application.MainFormHandle; //GetForegroundWindow; ShExecInfo.cbSize := sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC; ShExecInfo.lpVerb := 'open'; ShExecInfo.lpFile := PChar(Filename); ShExecInfo.lpParameters := PChar(Params); ShExecInfo.lpDirectory := PChar(ExtractFileDir(Filename)); ShExecInfo.nShow := WindowState; Result := ShellExecuteEx(@ShExecInfo); try if Result then begin repeat R := MsgWaitForMultipleObjects(1, ShExecInfo.hProcess, False, INFINITE,QS_ALLINPUT); if r <> WAIT_OBJECT_0 then Application.ProcessMessages; until r = WAIT_OBJECT_0; end else Showmessage('Fehler beim Starten der Anwendung:' + Filename + #13#10'System Fehler: ' + SysErrorMessage(GetLastError)); finally CloseHandle(ShExecInfo.hProcess); end; end; |
AW: WaitForSingleObject und Child-Prozesse
Vielen Dank für Eure wirklich guten Antworten. :thumb:
Hab mich letztlich für QuickAndDirty's Lösungsansatz entschieden, der sehr gut funktioniert. Gruss nru |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz