使用CreateProcessAsUser时等待进程退出

时间:2010-06-05 12:59:32

标签: c#

我在c#中使用 CreateProcessAsUser 来启动服务进程 我的服务需要等待进程退出,但我不知道我怎么做, 我不想使用检查进程列表中的进程existion

4 个答案:

答案 0 :(得分: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();

答案 1 :(得分:3)

签出http://www.pinvoke.net/签名。这是一个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);

答案 2 :(得分:0)

您可以使用GetExitCodeProcess,但请注意此功能会立即返回。

另一种方法是使用WaitForSingleObject。但这需要使用SYNCHRONIZE标志打开进程。例如:

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

答案 3 :(得分:0)

CreateProcessAsUser会返回一个结构PROCESS_INFORMATION,其中包含hProcess - 进程句柄。这是WaitForSingleObject / WaitForMultipleObjects函数的有效句柄。

MSDN:WaitForSingleObjectWaitForMultipleObjects