Warum sollte Process.WaitForExit eine "no process" -Ausnahme auslösen, selbst wenn ein Prozess existiert?

8

Ich habe einen Windows-Dienst, der diesen Code enthält:

%Vor%

Der Zweck dieses Codes ist die Ausführung eines IFilter-Extrakts in einem Dokument, wir verwenden einen separaten Prozess, weil einige IFilter notorisch flockig sind.

Nun läuft dieser Code einwandfrei in Windows 7 und Server 2008 R2-Boxen, aber auf einem Windows Server 2003 löst die WaitForExit sofort eine Ausnahme "Es gibt keinen Prozess, der mit diesem Prozessobjekt verknüpft ist" aus. Der Prozess existiert und schließt seine Aufgabe ohne Probleme ab.

Wer hat das gesehen? Kann jemand Licht in die Frage bringen, warum WaitForExit diesen Fehler tun würde?

Zusätzliche Informationen

Wenn ich diesen Code in eine Konsolen-App platziere, funktioniert er auch auf der Windws Server 2003-Box, daher scheint es ein spezifisches Problem zu sein, das in einem Service auf einer Windows Server 2003-Box ausgeführt wird.

>     
AnthonyWJones 02.02.2012, 10:18
quelle

1 Antwort

13

Beim Starten von Prozessen mit der Klasse System.Diagnostics.Process kann das System entweder die Funktion CreateProcess oder ShellExecuteEx Win32 verwenden. Bei Verwendung von CreateProcess können nur ausführbare Dateien gestartet werden. Bei Verwendung von ShellExecuteEx kann jede Datei, die mit dem Befehl "Start - & gt; Ausführen" gestartet werden kann, von der Shell gestartet werden.

Dies sind jedoch völlig unterschiedliche Arten, Prozesse zu starten. ShellExecuteEx umfasst die Shell und kann beispielsweise eine vorhandene Instanz von Word oder Excel zum Öffnen eines Dokuments mithilfe der unter dem Registrierungsschlüssel HKCR\<progid>\shell\<verb> gespeicherten Informationen erneut verwenden. Dazu kann beispielsweise DDE verwendet werden, um nach einer vorhandenen Excel-Instanz zu suchen und diese dann zu aktivieren.

Siehe Dokumentation zu ShellExecuteEx s SHELLEXECUTEINFO :

Beachten Sie, dass ShellExecuteEx möglicherweise einen hProcess zurückgibt, je nachdem, ob ein neuer Prozess gestartet wurde. Dies ist das Verhalten, das Sie sehen.

CreateProcess ist eine Funktion auf niedrigerer Ebene und erstellt direkt einen Prozess und übergibt einfach die äquivalenten Argumente. Es gibt immer einen Prozess-Handle zurück.

Hinweis: Da Sie scheinbar eine ausführbare Datei starten, ist es etwas überraschend, dass% hProcess nicht von ShellExecuteEx zurückgegeben wird. Wenn Sie jedoch sicherstellen möchten, dass Sie eine Prozesskennung erhalten, ist die Verwendung von UseShellExecute = false die richtige Vorgehensweise.

    
Ben 02.02.2012, 17:42
quelle