2010-06-05 3 views
5

я использую CreateProcessAsUser в C#, чтобы запустить процесс службой моей служба должна дожидаясь процесс выхода, но я не знаю, как я могу это сделать, Я не хочу использовать проверку процесса в списке процессовожидания процесса выхода при использовании CreateProcessAsUser

+0

Я добавил пример того, как обрабатывается дескриптор процесса. –

ответ

3

Отъезд http://www.pinvoke.net/ для подписей. Вот пример симе.

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

Вы можете использовать GetExitCodeProcess, но обратите внимание, что эта функция немедленно возвращается.

Другой подход использует WaitForSingleObject. Но для этого требуется, чтобы процесс был открыт с флагом SYNCHRONIZE. Пример:

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

CreateProcessAsUser возвращает вам структуру PROCESS_INFORMATION, которая содержит hProcess - дескриптор процесса. Это действительный дескриптор для функций WaitForSingleObject/WaitForMultipleObjects.

MSDN: WaitForSingleObject, WaitForMultipleObjects

7

В PROCESS_INFORMATION возвращает дескриптор вновь созданного процесса (hProcess), вы можете ждать от этой ручки, которые станут сигнализировал при выходе из процесса.

Вы можете использовать SafeWaitHandle инкапсулировать ручку, а затем использовать WaitHandle.WaitOne, чтобы дождаться завершения процесса.

Вот как вы бы обернуть процесс обрабатывать

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

И тогда следующий код может ждать на ручке

ProcessWaitHandle waitable = new ProcessWaitHandle(pi.hProcess); 
waitable.WaitOne(); 
Смежные вопросы