AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WaitForSingleObject und Child-Prozesse

Ein Thema von nru · begonnen am 9. Sep 2011 · letzter Beitrag vom 12. Sep 2011
Antwort Antwort
nru

Registriert seit: 30. Mai 2008
Ort: Bonn
40 Beiträge
 
Delphi 7 Enterprise
 
#1

WaitForSingleObject und Child-Prozesse

  Alt 9. Sep 2011, 10:42
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: WaitForSingleObject und Child-Prozesse

  Alt 9. Sep 2011, 21:09
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: WaitForSingleObject und Child-Prozesse

  Alt 9. Sep 2011, 22:26
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#4

AW: WaitForSingleObject und Child-Prozesse

  Alt 9. Sep 2011, 23:06
Wenns ohne Code Injection oder Treiber gehen soll:
  1. Erstell den Prozess für Dein Setup, allerdings "suspended".
  2. Geh die Prozess Liste durch und schau nach Prozessen bei denen die Parent Process ID der Deines Setup Prozesses entspricht.
  3. Resume den Setup Prozess und warte auf dessen Ende.
  4. Bevor Du das Process Handle zu Deinem Setup Prozess schließt, generier erneut eine Prozess Liste und schau erneut nach Prozessen bei denen die Parent Process ID der Deines Setup Prozesses entspricht.
  5. Dann vergleich die Resultate der beiden Suchdurchläufe. Sobald ein Prozess beim zweiten Suchlauf gefunden wurde, beim ersten allerdings nicht, wurde dieser von Deinem Setup gestartet. Für jeden dieser Prozesse kannst Du Dir dann ein Prozess Handle holen und mit der WaitForMultipleObjects Funktion warten bis alle von Deinem Setup gestarteten Prozesse beendet wurden.
  6. Mach die ganzen Process Handles zu.
Klingt wahrscheinlich unglaublich kompliziert, ist im Endeffekt aber recht simpel.
Fridolin Walther
"While Mr. Kim, by virtue of youth and naiveté, has fallen prey to the inexplicable need for human contact, let me step in and assure you that my research will go on uninterrupted, and that social relationships will continue to baffle and repulse me."
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#5

AW: WaitForSingleObject und Child-Prozesse

  Alt 10. Sep 2011, 00:38
Ich weiß nicht...laut MSDN funktioniert WaitForSingleObject nicht wenn weitere fenster aus dem prozess
heraus entstehen...

Sprich ich hatte so ein ähnliches Problem hier
http://www.delphipraxis.net/162142-t...cute-wait.html
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;
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
nru

Registriert seit: 30. Mai 2008
Ort: Bonn
40 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: WaitForSingleObject und Child-Prozesse

  Alt 12. Sep 2011, 09:31
Vielen Dank für Eure wirklich guten Antworten.
Hab mich letztlich für QuickAndDirty's Lösungsansatz entschieden, der sehr gut funktioniert.


Gruss
nru
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz