Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2009, 20:41   #1
dmitry86
Новичок
Джуниор
 
Регистрация: 30.10.2009
Сообщений: 3
По умолчанию Как закончить процесс вызываемый внутри сервиса?

Всем привет,
возникла такая проблема.
по наследству достался исходник Windows сервиса, я его подработал под новую версию софта, под который он написан, но после старта и остановки процесс висит в диспетчере задач, вместо того что бы отработать и исчезнуть, приходиться потом убивать их вручную. Речь идет о процессах stopserver.exe и startserver.exe . Подразумеваю надо куда-то вставить что-то или подправить, помогите пожалуйста т.к сам прежде с этим не работал.
СПАСИБО

Привожу открывок кода:

Код:
procedure TALFTSAService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
 ShellExecute(0, 'open', PChar(ALLIANCE + '\BSS\BIN\' + ARCH + '\stopserver.exe'), 'silent_stop', nil, SW_SHOWNORMAL) ;
 while (CountSAAProcs('bs_') > 0) do
   Sleep(10000);
 Sleep (10000);
 while (CountSAAProcs('aleempty') > 0) do
   Sleep(5000);
 Sleep(5000);
end;

procedure TALFTSAService.ServiceStart(Sender: TService;
 var Started: Boolean);
begin
 ALLIANCE := 'C:\Alliance\Access';
 ARCH := 'win32';
 if (ALLIANCE <> '') and (ARCH <> '') then
 begin
   ShellExecute(0, 'open', PChar(ALLIANCE + '\BSS\BIN\' + ARCH + '\startserver.exe'), 'silent_start', nil, SW_SHOWNORMAL) ;
   while (CountSAAProcs('bs_') < 5) do
     Sleep(10000);
   while (CountSAAProcs('mxs_') < 8) do
     Sleep(10000);
 end

Последний раз редактировалось rpy3uH; 01.11.2009 в 19:16.
dmitry86 вне форума Ответить с цитированием
Старый 30.10.2009, 20:59   #2
SnX
Форумчанин
 
Регистрация: 30.10.2009
Сообщений: 114
По умолчанию

Вместо ShellExecute используй CreateProcess, а затем по хендлу убивай процесс когда необходимо с помощью TerminateProcess.
SnX вне форума Ответить с цитированием
Старый 30.10.2009, 21:05   #3
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

Код:
function KillTask(ExeFileName: string): Integer;
const PROCESS_TERMINATE = $0001;
var ContinueLoop: BOOL;
    FSnapshotHandle: THandle;
    FProcessEntry32: TProcessEntry32;
begin 
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
    UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
    UpperCase(ExeFileName))) then
    Result := Integer(TerminateProcess(
    OpenProcess(PROCESS_TERMINATE,
    BOOL(0),
    FProcessEntry32.th32ProcessID),
    0));
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle); 
end;

KillTask('имя.exe');
Может так?
dr.Chas вне форума Ответить с цитированием
Старый 30.10.2009, 21:13   #4
dmitry86
Новичок
Джуниор
 
Регистрация: 30.10.2009
Сообщений: 3
По умолчанию

Ребят спасибо, не комментирую лишь мотаю на ус, тк в программирование не силен.

В целом все работает, единственное что когда сервис останавливается в диспетчере задач остается торчать stopserver.exe и он держит том, который монтируется с внешнего стораджа кластерным софтом, и из-за этого просходит подвисание тома, после ручного удаления stopserver все отрабатывает прекрасно, логический том уходит в офлайн.

Я буду очень признателен, если допишите к моему коду строчку, которая как раз будет только вызывать stopserver.exe , а не оставлять его навсегда
К сожалению проверить смогу только в понедельник на работе.
Спасибо

Последний раз редактировалось dmitry86; 30.10.2009 в 21:15.
dmitry86 вне форума Ответить с цитированием
Старый 30.10.2009, 21:27   #5
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

Код:
winexec('stopserver.exe', SW_Show {стиль окна} );
shellexecute //другая функция
dr.Chas вне форума Ответить с цитированием
Старый 31.10.2009, 00:37   #6
dmitry86
Новичок
Джуниор
 
Регистрация: 30.10.2009
Сообщений: 3
По умолчанию

а как сделать что бы вместо этого куска
while (CountSAAProcs('aleempty') > 0) do
Sleep(5000);
Sleep(5000);
end;

было бы когда bs_ процессов становиться ноль (уже есть эта строчка), ждать 10 сек и удалять процесс stopserver.exe...

Спасибо
dmitry86 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как закончить программу? Cry Помощь студентам 0 21.10.2009 09:28
Как раскрасить ячейку внутри StringGrid. GarfieldX Общие вопросы Delphi 5 14.02.2008 21:59
Как запустить программу из сервиса Маркъ Общие вопросы Delphi 5 13.02.2007 00:29
как узнать путь запущенного сервиса Alar Общие вопросы Delphi 0 30.10.2006 11:18