2010-06-05 10 views
5

ich verwende CreateProcessAsUser in C# einen Prozess von einem Dienst mein Dienst muss warten auf den Prozess zu starten, um zu beenden, aber ich weiß nicht, wie ich es tun kann, Ich möchte nicht die Prozess Existenz in Prozessliste verwendenWarten auf Prozess zu beenden, wenn CreateProcessAsUser mit

+0

Ich habe ein Beispiel hinzugefügt, wie der Prozess behandelt werden kann. –

Antwort

3

prüfen auf dem Griff warten handhaben würde wickeln aus http://www.pinvoke.net/ für Signaturen. Hier ist ein Beispiel.

const UInt32 INFINITE = 0xFFFFFFFF; 

// Declare variables 
PROCESS_INFORMATION pi; 
STARTUPINFO si; 
System.IntPtr hToken; 

// Create structs 
SECURITY_ATTRIBUTES saThreadAttributes = new SECURITY_ATTRIBUTES();  

// Now create the process as the user 
if (!CreateProcessAsUser(hToken, String.Empty, commandLine, 
null, saThreadAttributes, false, 0, IntPtr.Zero, 0, si, pi)) 
{ 
// Throw exception 
throw new Exception("Failed to CreateProcessAsUser"); 
} 

WaitForSingleObject(pi.hProcess, (int)INFINITE); 
0

Sie könnten GetExitCodeProcess verwenden, aber beachten Sie, dass diese Funktion sofort zurückkehrt.

Ein anderer Ansatz ist WaitForSingleObject. Dazu muss der Prozess jedoch mit dem Flag SYNCHRONIZE geöffnet werden. Beispiel:

IntPtr hwnd = OpenProcess(SYNCHRONIZE, 0, pid); 
if (hwnd != IntPtr.Zero) { 
    WaitForSingleObject(hwnd, INFINITE); 
    CloseHandle(hwnd); 
} 
0

CreateProcessAsUser kehrt man eine Struktur PROCESS_INFORMATION, die hProcess enthält - Prozess Griff. Dies ist ein gültiger Handle für WaitForSingleObject/WaitForMultipleObjects Funktionen.

MSDN: WaitForSingleObject, WaitForMultipleObjects

7

Die PROCESS_INFORMATION kehrt der Griff in die neu geschaffene Verfahren (hProcess), die Sie auf dieser Griff warten können, die, wenn der Prozess beendet signalisiert wird geworden.

Sie können SafeWaitHandle kapseln das Handle und dann WaitHandle.WaitOne verwenden, um auf den Prozess zum Beenden warten.

Hier ist, wie man den Prozess

class ProcessWaitHandle : WaitHandle 
{ 
    public ProcessWaitHandle(IntPtr processHandle) 
    { 
    this.SafeWaitHandle = new SafeWaitHandle(processHandle, false); 
    } 
} 

Und dann der folgende Code kann

ProcessWaitHandle waitable = new ProcessWaitHandle(pi.hProcess); 
waitable.WaitOne(); 
Verwandte Themen