Я пытаюсь запустить другой процесс из службы (это консольное приложение, которое собирает некоторые данные и записывает их в реестр), но по какой-то причине я не могу заставить его правильно запускаться.
Основы того, что я пытаюсь сделать, таковы:
- Запустить процесс
- Дождаться окончания процесса
- Получить код возврата из процесса
В настоящее время я использую следующий код:
STARTUPINFO info={sizeof(info)};
PROCESS_INFORMATION processInfo;
if (CreateProcess(PATH, ARGS, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
{
::WaitForSingleObject(processInfo.hProcess, INFINITE);
DWORD exit = 100;
GetExitCodeProcess(processInfo.hProcess, &exit);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
return exit;
}
После вызова CreateProcess () он завершается успешно и входит в тело оператора if. Вызов WaitForSingleObject немедленно возвращается, чего не следует делать, так как процесс должен занять около 20-30 секунд. И, наконец, вызов GetExitCodeProcess () завершается неудачно и не устанавливает значение «exit».
К вашему сведению, этот код я успешно использовал в другом месте, но не в службе.
Может ли быть так, что он запускается из службы и есть проблемы с разрешениями ??
Редактировать: Теперь я понял, что оно действительно запустит приложение (я вижу это в TaskMan), но оно застряло. Он там, но ничего не делает.
Основываясь на предложении Роба Кеннеди , я исправил проблему с дескриптором процесса, и он действительно ждет завершения процесса. Но это никогда не закончится, если я не убью его вручную.