Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.07;
Скачать: CL | DM;

Вниз

Ожидание завершения программы из сервиса   Найти похожие ветки 

 
race1   (2007-09-10 10:41) [0]

Мне надо запустить из сервиса программу и после какого-то времени, если программа не завершится, убить её. Сделал тестовое приложение как 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 будет единицей.


 
Reindeer Moss Eater ©   (2007-09-10 10:42) [1]

CreateProcess - это функция


 
clickmaker ©   (2007-09-10 10:42) [2]


> Мне надо запустить из сервиса программу

зачем? она что должна сделать?


 
race1   (2007-09-10 10:49) [3]

>Reindeer Moss Eater
Обработка возвращаемых значений опущена

>clickmaker
Есть задание, которое надо выполнять с заданной периодичностью (раз в две минуты, например), надо вызывать батник во время выполнения задания. Батник может быть написан криво, например, там будет команда pause. Т.е. остальных итераций не будет и сервис тупо повиснет.


 
Reindeer Moss Eater ©   (2007-09-10 10:50) [4]

Обработка возвращаемых значений опущена

Гетластеррор вызывал после того, как createprocess вернул тебе False?
Ну и фик ли ты хочешь?


 
race1   (2007-09-10 10:54) [5]

CreateProcess работает, я же говорю, в реальном коде есть проверка ошибок. CreateProcess возвращает true.


 
clickmaker ©   (2007-09-10 10:57) [6]


> Батник может быть написан криво, например, там будет команда
> pause

а почему бы не писать батник прямо?
программы для работы под ковром всеж-таки должны отличаться от интерактивных, разве нет?


 
Anatoly Podgoretsky ©   (2007-09-10 10:59) [7]

> race1  (10.09.2007 10:54:05)  [5]

А зачем нам обсуждать заведомо не реальный код.
Может ты Кеннеди убил и "мамой клянусь - это не я"


 
Сергей М. ©   (2007-09-10 11:01) [8]


> говорит "WAIT_OBJECT_0", хотя запущенная программа работает


Так не бывает.

WAIT_OBJECT_0 однозначно говорит, что интересующий процесс завершился.


 
race1   (2007-09-10 11:01) [9]

>clickmaker
Хочется сделать защиту от дурака :)

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


 
Сергей М. ©   (2007-09-10 11:04) [10]


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


Процесс сигналит сразу после завершения.
После завершения процесс сразу сигналит.
Процесс не сигналит, если он не завершился.
Если процесс не завершился. то он не сигналит.

Что непонятно ?


 
race1   (2007-09-10 11:06) [11]

>Сергей М.
Ок. Тогда что такое запущенный процесс 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);
...


 
clickmaker ©   (2007-09-10 11:07) [12]


> Хочется сделать защиту от дурака

а почему не сделать защитой от дурака файлик readme.txt с коротенькой инструкцией по написанию батников? Что, дескать, не надо там паузу вставлять
Почему вместо того, чтобы грабли убрать, надо ручку обивать паралоном? )


 
Сергей М. ©   (2007-09-10 11:10) [13]


> что такое запущенный процесс cmd.exe, висящий в процессах


Он есть все что угодно, но только не тот самый, который тебе просигналил. Если он тебе вообще просигналил.


 
Anatoly Podgoretsky ©   (2007-09-10 11:12) [14]

> clickmaker  (10.09.2007 11:07:12)  [12]

Шлем надо надевать.


 
Reindeer Moss Eater ©   (2007-09-10 11:32) [15]

> говорит "WAIT_OBJECT_0", хотя запущенная программа работает

ну вот например такой батник:

start notepad.exe


 
race1   (2007-09-10 11:43) [16]

Вот что было: если в параметре lpApplicationName задавать полный путь к батнику, функция завершается успешно, но getlasterror говорит что "указанный модуль не найден". Хотя батник отрабатывает - проверил это созданием файла. Да и в процессах он висит (cmd.exe).

Если первому параметру задавать %windir%\system32\cmd.exe /c "bat_filename params", то всё работает как надо...

Засада...


 
Reindeer Moss Eater ©   (2007-09-10 11:55) [17]

Никакой засады, если знать какой у сервиса текущий каталог по дефолту.


 
Сергей М. ©   (2007-09-10 11:59) [18]


> race1


Нафиг нужен cmd, когда есть WScript/CScript ?


 
race1   (2007-09-10 12:18) [19]

>Reindeer Moss Eater
%windir%\system32. И что это меняет? Путь к батнику был полный, батник не был на сетевом/виртуальном диске. Он запускался и работал<b/>, он создавал файлы и висел в процессах. CreateProcess говорил что "всё ок, процесс создан". А на самом деле getlasterror говорил что "модуль не найден" и waitforsingleobject не работала как надо.

>Сергей М.
Батника для той задачи, для которой он создаётся, хватает за глаза - выполнить другую консольную программку, передав ей пару параметров, может быть выполнить пару консольных программок и может удалить/создать файлик. Вы ещё скажите сделать механизм плагинов и вместо батников писать dll на любом языке, ибо "нафик wsh, когда есть дельфи/си/и т.д." :(


 
Сергей М. ©   (2007-09-10 13:31) [20]


> race1   (10.09.07 12:18) [19]


Ликбез
http://www.podgoretsky.com/ftp/Docs/WSH/Klimov/


 
race1   (2007-09-10 13:38) [21]

>Сергей М.
Я знаю что такое wsh и на нём даже написан целый один скрипт :) В остальном нам в работе хватает батников.


 
Slym ©   (2007-09-10 14:01) [22]

у запускай процесс в Job"е на Job много всяких разных ограничений поставить можно: память, время, дочерние процессы


 
Anatoly Podgoretsky ©   (2007-09-10 14:03) [23]

> race1  (10.09.2007 13:38:21)  [21]

Пришло время написать второй.


 
Slym ©   (2007-09-10 14:04) [24]

например http://forum.sources.ru/index.php?showtopic=95439


 
Slym ©   (2007-09-10 14:07) [25]

http://rosigma.boom.ru/richter/head5.htm


 
race1   (2007-09-10 14:15) [26]

>Slym
Спасибо, но createprocess мне вполне хватит :)


 
Slym ©   (2007-09-11 05:10) [27]

race1   (10.09.07 14:15) [26]
Зря... а если порожденый процесс породит еще чтонить... как гасить будешь?


 
race1   (2007-09-11 13:46) [28]

>Slym
Никак... :) Позже можно посмотреть в эту сторону, пока хватит CreateProcess.



Страницы: 1 вся ветка

Текущий архив: 2007.10.07;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.032 c
2-1189658154
Sflatt
2007-09-13 08:35
2007.10.07
Возможные проблемы при сворачивании в трей.


15-1189531719
TStas
2007-09-11 21:28
2007.10.07
Как же бороться с брандмауэром?


15-1188302433
Внук
2007-08-28 16:00
2007.10.07
Съездили в Москву


15-1189187056
rueus
2007-09-07 21:44
2007.10.07
Помогите найти описание структур


2-1189420317
Nikola62
2007-09-10 14:31
2007.10.07
Как не дать форме открыться