Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.053 c
15-1189085643
savyhinst_
2007-09-06 17:34
2007.10.07
Сломаная винда.


15-1189006519
С.Толик
2007-09-05 19:35
2007.10.07
Как (Кто сможет?) перевести данный код с Delphi на С++


6-1170410970
DillerXX
2007-02-02 13:09
2007.10.07
TUN/TAP


6-1170777738
M@kc
2007-02-06 19:02
2007.10.07
idMessage.Subject


4-1175969967
AGGRESSOR
2007-04-07 22:19
2007.10.07
GUI (redirect output from console application)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский