2010-06-05 13 views
5

estoy usando CreateProcessAsUser en C# para poner en marcha un proceso por un servicio de mi servicio tiene que esperar a que el proceso para salir, pero yo no sé cómo puedo hacerlo, no quiero utilizar la comprobación de la existencia del proceso en la lista de procesosde espera para el proceso para salir al utilizar CreateProcessAsUser

+0

He añadido un ejemplo de cómo se puede envolver el identificador del proceso. –

Respuesta

3

Salida http://www.pinvoke.net/ para la firma. Aquí hay un ejemplo sime.

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

Puede usar GetExitCodeProcess, pero tenga en cuenta que esta función vuelve inmediatamente.

Otro enfoque es usar WaitForSingleObject. Pero esto requiere que el proceso se abra con la bandera SYNCHRONIZE. Ejemplo:

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

CreateProcessAsUser le devuelve una estructura PROCESS_INFORMATION, que contiene hProcess - identificador de proceso. Este es un identificador válido para las funciones WaitForSingleObject/WaitForMultipleObjects.

MSDN: WaitForSingleObject, WaitForMultipleObjects

7

Los PROCESS_INFORMATION devuelve el identificador para el proceso de nueva creación (hProcess), se puede esperar en esta manija que pasará a ser señalado cuando el proceso finalice.

Puede usar SafeWaitHandle encapsular el controlador y luego usar WaitHandle.WaitOne para esperar a que el proceso salga.

Aquí es cómo se envuelva el proceso de manejar

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

Y luego el siguiente código se puede esperar en el mango

ProcessWaitHandle waitable = new ProcessWaitHandle(pi.hProcess); 
waitable.WaitOne(); 
Cuestiones relacionadas