2010-06-05 58 views
5

当我使用CreateProcessAsUser在C#中由服务 我的服务需要等待进程退出启动一个进程,但我不知道我能做到这一点退出, 我不想使用检查进程列表中的进程existion等待过程中使用CreateProcessAsUser

+0

我添加了一个如何包装进程句柄的例子。 – 2010-06-05 15:47:23

回答

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:WaitForSingleObjectWaitForMultipleObjects

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();