当我使用CreateProcessAsUser在C#中由服务 我的服务需要等待进程退出启动一个进程,但我不知道我能做到这一点退出, 我不想使用检查进程列表中的进程existion等待过程中使用CreateProcessAsUser
5
A
回答
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
函数的有效句柄。
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();
我添加了一个如何包装进程句柄的例子。 – 2010-06-05 15:47:23