我在c#中使用 CreateProcessAsUser 来启动服务进程 我的服务需要等待进程退出,但我不知道我怎么做, 我不想使用检查进程列表中的进程existion
答案 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
函数的有效句柄。