我正在使用CreateProcessAsUser在c#中通过服务启动一个进程,我的服务需要等待进程退出,但我不知道该如何做,我不想使用在进程列表中检查进程退出
发布于 2010-06-05 13:20:58
请查看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);发布于 2010-06-05 13:11:36
信息将句柄返回给新创建的进程(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();发布于 2010-06-05 13:09:41
您可以使用GetExitCodeProcess,但请注意,此函数将立即返回。
另一种方法是使用WaitForSingleObject。但这需要使用同步性标志打开进程。示例:
IntPtr hwnd = OpenProcess(SYNCHRONIZE, 0, pid);
if (hwnd != IntPtr.Zero) {
WaitForSingleObject(hwnd, INFINITE);
CloseHandle(hwnd);
}https://stackoverflow.com/questions/2980423
复制相似问题