![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ожидание завершения программы из сервиса
race1 © (2007-09-10 10:41:00)Мне надо запустить из сервиса программу и после какого-то времени, если программа не завершится, убить её. Сделал тестовое приложение как vcl form app, всё работает.
Вот код:
var
si: TStartupInfo;
pi: TProcessInformation;
begin
ZeroMemory(@si, SizeOf(si));
si.cb := SizeOf(si);
CreateProcess(PChar(ProgramName), PChar(ProgramParams), nil, nil, FALSE, 0, nil, nil, si, &pi);
if WaitForSingleObject(pi.hProcess, 60000) WAIT_OBJECT_0 then
TerminateProcess(pi.hProcess, 1);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
...
Сделал запуск и ожидание в сервисе - WaitForSingleObject завершается сразу, и говорит "WAIT_OBJECT_0", хотя запущенная программа работает. Если узнать код возврата (GetExitCodeProcess(pi.hProcess, &ret)), то ret будет единицей.
race1 (2007-09-11 13:46:00) [1]>Slym
Никак... :) Позже можно посмотреть в эту сторону, пока хватит CreateProcess.
Slym (2007-09-11 05:10:00) [2]race1 (10.09.07 14:15) [26]
Зря... а если порожденый процесс породит еще чтонить... как гасить будешь?
race1 (2007-09-10 14:15:00) [3]>Slym
Спасибо, но createprocess мне вполне хватит :)
Slym (2007-09-10 14:07:00) [4]http://rosigma.boom.ru/richter/head5.htm
Slym (2007-09-10 14:04:00) [5]например http://forum.sources.ru/index.php?showtopic=95439
Anatoly Podgoretsky (2007-09-10 14:03:00) [6]> race1 (10.09.2007 13:38:21) [21]
Пришло время написать второй.
Slym (2007-09-10 14:01:00) [7]у запускай процесс в Job'е на Job много всяких разных ограничений поставить можно: память, время, дочерние процессы
race1 (2007-09-10 13:38:00) [8]>Сергей М.
Я знаю что такое wsh и на нём даже написан целый один скрипт :) В остальном нам в работе хватает батников.
Сергей М. (2007-09-10 13:31:00) [9]
> race1 (10.09.07 12:18) [19]
Ликбез
http://www.podgoretsky.com/ftp/Docs/WSH/Klimov/
race1 (2007-09-10 12:18:00) [10]>Reindeer Moss Eater
%windir%\system32. И что это меняет? Путь к батнику был полный, батник не был на сетевом/виртуальном диске. Он запускалсяи работал<b/>, он создавал файлы и висел в процессах. CreateProcess говорил что "всё ок, процесс создан". А на самом деле getlasterror говорил что "модуль не найден" и waitforsingleobject не работала как надо.
>Сергей М.
Батника для той задачи, для которой он создаётся, хватает за глаза - выполнить другую консольную программку, передав ей пару параметров, может быть выполнить пару консольных программок и может удалить/создать файлик. Вы ещё скажите сделать механизм плагинов и вместо батников писать dll на любом языке, ибо "нафик wsh, когда есть дельфи/си/и т.д." :(
Сергей М. (2007-09-10 11:59:00) [11]
> race1
Нафиг нужен cmd, когда есть WScript/CScript ?
Reindeer Moss Eater (2007-09-10 11:55:00) [12]Никакой засады, если знать какой у сервиса текущий каталог по дефолту.
race1 (2007-09-10 11:43:00) [13]Вот что было: если в параметре lpApplicationName задавать полный путь к батнику, функция завершается успешно, но getlasterror говорит что "указанный модуль не найден". Хотя батник отрабатывает - проверил это созданием файла. Да и в процессах он висит (cmd.exe).
Если первому параметру задавать %windir%\system32\cmd.exe /c "bat_filename params", то всё работает как надо...
Засада...
Reindeer Moss Eater (2007-09-10 11:32:00) [14]> говорит "WAIT_OBJECT_0", хотя запущенная программа работает
ну вот например такой батник:
start notepad.exe
Anatoly Podgoretsky (2007-09-10 11:12:00) [15]> clickmaker (10.09.2007 11:07:12) [12]
Шлем надо надевать.
Сергей М. (2007-09-10 11:10:00) [16]
> что такое запущенный процесс cmd.exe, висящий в процессах
Он есть все что угодно, но только не тот самый, который тебе просигналил. Если он тебе вообще просигналил.
clickmaker (2007-09-10 11:07:00) [17]
> Хочется сделать защиту от дурака
а почему не сделать защитой от дурака файлик readme.txt с коротенькой инструкцией по написанию батников? Что, дескать, не надо там паузу вставлять
Почему вместо того, чтобы грабли убрать, надо ручку обивать паралоном? )
race1 (2007-09-10 11:06:00) [18]>Сергей М.
Ок. Тогда что такое запущенный процесс cmd.exe, висящий в процессах, выполняющий батник, в котором одна строка pause, запущенный сервисом? :)
>Anatoly Podgoretsky
Ну вообще-то код такой:
var
si: TStartupInfo;
pi: TProcessInformation;
begin
ZeroMemory(@si, SizeOf(si));
si.cb := SizeOf(si);
if not CreateProcess(PChar(ProgramName), PChar(ProgramParams), nil, nil, FALSE, 0, nil, nil, si, &pi) then
Exit;
if WaitForSingleObject(pi.hProcess, 60000) WAIT_OBJECT_0 then
TerminateProcess(pi.hProcess, 1);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
...
Сергей М. (2007-09-10 11:04:00) [19]
> почему процесс сигналит сразу, а не после завершения?
Процесс сигналит сразу после завершения.
После завершения процесс сразу сигналит.
Процесс не сигналит, если он не завершился.
Если процесс не завершился. то он не сигналит.
Чтонепонятно ?
race1 (2007-09-10 11:01:00) [20]>clickmaker
Хочется сделать защиту от дурака :)
А по вопросу всё-таки - почему процесс сигналит сразу, а не после завершения?