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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2013, 00:52   #1
noname_06
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 49
Вопрос Как остановить службу Windows

Доброго времени суток!
Пытаюсь разобраться с остановкой служб Windows. Использование sc stop не подходит, т.к. хочу отслеживать вариант "служба не запущена" и "не могу остановить". На основании нарытого в интернете получился следующий, но нерабочий, код :
Попытка №1 (Логику кода не понял, копипаст наугад. Хотя кое-что может и понял, но не уверен )
Код:
procedure TForm1.btn1Click(Sender: TObject);
var
  h_manager, h_svc: SC_Handle;
  svc_status: TServiceStatus;
  dwCheckPoint: DWord;
begin
  try
  h_manager:=OpenSCManager('',nil, SC_MANAGER_CONNECT);
  if h_manager > 0 then
  begin
    h_svc := OpenService(h_manager,PChar('MY TEST SERVICE NAME'),
    SERVICE_STOP or SERVICE_QUERY_STATUS);
    if h_svc > 0 then
    begin
      if(ControlService(h_svc,SERVICE_CONTROL_STOP, svc_status)) then
      begin
        if(QueryServiceStatus(h_svc,svc_status))then
        begin
          while(SERVICE_STOPPED <> svc_status.dwCurrentState)do
          begin
            dwCheckPoint := svc_status.dwCheckPoint;
            Sleep(svc_status.dwWaitHint);
            if(not QueryServiceStatus(h_svc,svc_status))then break;
            if(svc_status.dwCheckPoint < dwCheckPoint)then break;
          end;
        end;
      end;
      CloseServiceHandle(h_svc);
    end;
    CloseServiceHandle(h_manager);
  Memo1.Lines.Add('Служба остановлена');
  end;
  except
  Memo1.Lines.Add('Ошибка остановки службы' + IntToStr(GetLastError));
  end;
end;
РЕШЕНО:
Попытка №2
Код:
uses WinSvc;
...
procedure TForm1.btn1Click(Sender: TObject);
var
aa:cardinal;ess:TEnumServiceStatus;
begin
aa:=OpenService(OpenSCManager(nil,nil, SC_MANAGER_ALL_ACCESS),'mmcss',SERVICE_ALL_ACCESS);
mmo1.Lines.Add(IntToStr(aa));
ControlService(aa,SERVICE_CONTROL_STOP,ess.ServiceStatus);
mmo1.Lines.Add(IntToStr(GetLastError));
CloseServiceHandle(aa);
end;
//Код ошибки: 1051 (0x041B) Команда остановки была отправлена службе, от которой зависят другие службы. = все арбайтен)

Это нормально что хэндл службы постоянно меняется?

Последний раз редактировалось noname_06; 26.03.2013 в 02:06. Причина: решено
noname_06 вне форума Ответить с цитированием
Старый 31.03.2013, 18:45   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ты бы проверку ошибок расставил бы. Тогда и будет рабочий и надёжный. А не говно.

Цитата:
Это нормально что хэндл службы постоянно меняется?
Все описатели - суть вещь динамическая. Это нормально, что у тебя в гардеробе/раздевалке каждый раз другой номер?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 03.04.2013, 22:37   #3
noname_06
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 49
По умолчанию

Цитата:
Все описатели - суть вещь динамическая
Видимо у меня сформировалось ошибочное мнение что хэндл служба получает при запуске и не меняет его во время выполнения.
Цитата:
Ты бы проверку ошибок расставил бы. Тогда и будет рабочий и надёжный. А не говно.
Вначале чтения Вашего ответа слово г***о вызвало острую попоболь , но потом вспомнил что этот код - лишь слегка адаптированная заготовка под мои нужды и в таком виде использоваться в программе не может (тут попоболь прошла ). По поводу ссылки - абсолютно согласен и ВСЕГДА стараюсь вначале ПОНЯТЬ как это работает, и лишь потом писать под свои нужды, сверяясь с образцом. Хотя каюсь, грешен, одно время был уверен, что можно жить нарезкой из чужого "выкака".
noname_06 вне форума Ответить с цитированием
Старый 04.04.2013, 02:14   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Любой описатель формируется при открытии. Это не идентификатор. У одной службы может быть много описателей. К примеру, одну и ту же службу можно открыть два раза с разными правами. Получим два разных описателя.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отключить службу DNS-клиент через cmd (Windows XP/7) Nikkonofun Операционные системы общие вопросы 3 25.06.2012 19:22
Windows API-запустить или остановить устройство niknv Win Api 3 21.09.2011 15:58
Создать программу как службу dimonbest Общие вопросы Delphi 53 25.05.2011 22:13
Как программно установить службу в windows? KiL0z Общие вопросы Delphi 2 10.05.2011 02:29
Как остановить Excel kzld Microsoft Office Excel 5 07.11.2010 13:33