я использую CreateProcessAsUser в C#, чтобы запустить процесс службой моей служба должна дожидаясь процесс выхода, но я не знаю, как я могу это сделать, Я не хочу использовать проверку процесса в списке процессовожидания процесса выхода при использовании CreateProcessAsUser
ответ
Отъезд 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);
Вы можете использовать GetExitCodeProcess, но обратите внимание, что эта функция немедленно возвращается.
Другой подход использует WaitForSingleObject. Но для этого требуется, чтобы процесс был открыт с флагом SYNCHRONIZE. Пример:
IntPtr hwnd = OpenProcess(SYNCHRONIZE, 0, pid);
if (hwnd != IntPtr.Zero) {
WaitForSingleObject(hwnd, INFINITE);
CloseHandle(hwnd);
}
CreateProcessAsUser
возвращает вам структуру PROCESS_INFORMATION
, которая содержит hProcess
- дескриптор процесса. Это действительный дескриптор для функций WaitForSingleObject
/WaitForMultipleObjects
.
В 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. выхода перенаправления в файл из CreateProcessAsUser
- 2. Код выхода детского процесса! = 0 при использовании труб
- 3. с помощью spawnl и ожидания выхода дочернего процесса
- 4. Ncurses фон ожидания выхода
- 5. Прерывание при размещении процесса в очереди ожидания
- 6. java: Время ожидания процесса апплетного процесса
- 7. CreateProcessAsUser() не показывает CreateWindow для запуска процесса [C#]
- 8. CreateProcessAsUser - AccessViolationError
- 9. Состояние выхода процесса распечатывается до его выхода
- 10. CreateProcessAsUser создает пустое/черное окно
- 11. ThreadAborted in Moq.Verify при использовании async-ожидания
- 12. Ошибка при использовании структуры ожидания для просмотра
- 13. ожидания() для дочернего процесса аварии
- 14. Почему нет ожидания ждать завершения процесса?
- 15. unix-скрипт для выхода из ошибки oracle при использовании оператора ожидания
- 16. Предотвращение выхода промежуточного компаса при использовании трубопроводов
- 17. Состояние выхода Bash при использовании цикла while
- 18. наушников объем выпуска при использовании выхода AvAudioEngine
- 19. Извлеченный сервер выхода при использовании автозагрузчика Django
- 20. предупреждение последовательность выхода Неизвестно при использовании «\ /»
- 21. Нет выхода в stdout при использовании мьютекса
- 22. Нет выхода при использовании совпадений regex
- 23. Хвост файла до выхода процесса
- 24. Получение выхода кода прерванного процесса
- 25. Обработка события выхода дочернего процесса
- 26. Крючок выхода для Java-процесса
- 27. Событие процесса выхода узла js
- 28. выхода процесса является слишком большим
- 29. Время ожидания процесса АОС в Webstorm
- 30. Проблема при использовании процесса windows в Qt
Я добавил пример того, как обрабатывается дескриптор процесса. –