Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ожидание завершения программы из сервиса


Страницы:   1 2

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
Хочется сделать защиту от дурака :)

А по вопросу всё-таки - почему процесс сигналит сразу, а не после завершения?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо