首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CreateProcessAsUser时等待进程退出

使用CreateProcessAsUser时等待进程退出
EN

Stack Overflow用户
提问于 2010-06-05 12:59:32
回答 3查看 4.8K关注 0票数 6

我正在使用CreateProcessAsUser在c#中通过服务启动一个进程,我的服务需要等待进程退出,但我不知道该如何做,我不想使用在进程列表中检查进程退出

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-05 13:20:58

请查看http://www.pinvoke.net/的签名。下面是一个类似的例子。

代码语言:javascript
复制
 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);
票数 4
EN

Stack Overflow用户

发布于 2010-06-05 13:11:36

信息将句柄返回给新创建的进程(hProcess),您可以等待此句柄,该句柄将在进程退出时发出信号。

您可以使用SafeWaitHandle封装句柄,然后使用WaitHandle.WaitOne等待进程退出。

下面是如何包装流程句柄

代码语言:javascript
复制
class ProcessWaitHandle : WaitHandle
{
  public ProcessWaitHandle(IntPtr processHandle)
  {
    this.SafeWaitHandle = new SafeWaitHandle(processHandle, false);
  }
}

然后,下面的代码可以等待句柄

代码语言:javascript
复制
ProcessWaitHandle waitable = new ProcessWaitHandle(pi.hProcess);
waitable.WaitOne();
票数 8
EN

Stack Overflow用户

发布于 2010-06-05 13:09:41

您可以使用GetExitCodeProcess,但请注意,此函数将立即返回。

另一种方法是使用WaitForSingleObject。但这需要使用同步性标志打开进程。示例:

代码语言:javascript
复制
IntPtr hwnd = OpenProcess(SYNCHRONIZE, 0, pid);
if (hwnd != IntPtr.Zero) {
    WaitForSingleObject(hwnd, INFINITE);
    CloseHandle(hwnd);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2980423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档