Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Остановить зависшую службу, В статусе "start pending" 
V
    Опции темы
neweraser
Дата 5.6.2018, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



Доброго времени суток!
Суть в чем, есть программа, некая оболочка для запуска своих самописных служб. Если служба кривая (как и мои руки иногда) - бывают моменты, что она зависает на запуске в статусе "Start pending", помогает только ребут или следующие действия в cmd:
Код

sc queryex SERVICENAME
taskkill /PID PROCESS_PID_NNN /F

где PROCESS_PID_NNN - номер процесса для остановки.
В WinApi я не разбираюсь, использую готовые процедуры, например:
Код

function TMainForm.StopService(ServiceName: String): Boolean;
var
  hService, hSCM: Dword;
  svc_status: TServiceStatus;
begin
  Result:= True;
  hSCM:= OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if hSCM = 0 then
  begin
    Result:= False;
    MessageBox(handle, PChar('Для остановки службы нужны права администратора!'), PChar('Внимание!'), MB_OK + MB_ICONWARNING);
    Exit;
  end;
  hService:= OpenService(hSCM, PChar(ServiceName), SERVICE_ALL_ACCESS);
  if hService <> 0 then
  begin
    if not ControlService(hService, SERVICE_CONTROL_STOP, svc_status) then
    begin
      CloseServiceHandle(hService);
      CloseServiceHandle(hSCM);
      Result:= False;
      MessageBox(handle, PChar('Ошибка остановки службы!'), PChar('Внимание!'), MB_OK + MB_ICONWARNING);
      Exit;
    end;
  end else
  begin
    CloseServiceHandle(hSCM);
    Result:= False;
    MessageBox(handle, PChar('Ошибка открытия службы!'), PChar('Внимание!'), MB_OK + MB_ICONWARNING);
    Exit;
  end;
  CloseServiceHandle(hService);
  CloseServiceHandle(hSCM);
end;

Но приведенный выше код останавливает только корректно запущенную службу.
Есть ли какое-то решение на WinApi для остановки зависшей службы или мне смотреть в сторону cmd по PID процесса? Поиск не дал результатов, решения так и не нашел. 


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
navodri
Дата 5.6.2018, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 26.10.2007

Репутация: нет
Всего: -1



Посмотри вот эту библиотеку айпишную. Там много пример на айпи. Может, что-то поможет.
PM MAIL WWW   Вверх
neweraser
Дата 5.6.2018, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 17.2.2008

Репутация: нет
Всего: 6



navodri, не нашел то что мне нужно, да и она немного платная. А вы всем на форуме ее рекомендуете?  smile 


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
Snowy
Дата 5.6.2018, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11338
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 482



Ну раз сервис не отвечает, значит нужно его смертельно убивать насмерть.
Как-то так:
Код
type
  SC_HANDLE = Cardinal;
  SC_STATUS_TYPE=(SC_STATUS_PROCESS_INFO);
  SERVICE_STATUS_PROCESS = record
    dwServiceType: DWORD;
    dwCurrentState: DWORD;
    dwControlsAccepted: DWORD;
    dwWin32ExitCode: DWORD;
    dwServiceSpecificExitCode: DWORD;
    dwCheckPoint: DWORD;
    dwWaitHint: DWORD;
    dwProcessId: DWORD;
    dwServiceFlags: DWORD;
  end;
function QueryServiceStatusEx(hService: SC_HANDLE; InfoLevel: SC_STATUS_TYPE;
  var lpBuffer: SERVICE_STATUS_PROCESS; cbBufSize: DWORD; var pcbBytesNeeded: DWORD): BOOL; stdcall;
  external advapi32 name 'QueryServiceStatusEx';

// получить id процесса службы
function GetServiceProcessId(ServiceName: String; Status: DWORD = 0): THandle;
var
  hService, hSCM, d: Dword;
  scStatus: SERVICE_STATUS_PROCESS;
begin
  Result := 0;
  hSCM := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
  if hSCM > 0 then
  begin
    hService := OpenService(hSCM, PChar(ServiceName), SERVICE_QUERY_STATUS);
    if hService > 0 then
    begin
      d := SizeOf(scStatus);
      if QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, scStatus, d, d) then
      begin
        if (Status = 0) or (scStatus.dwCurrentState = Status) then
          Result := scStatus.dwProcessId;
      end;
    end;
  end;
end;


function TMainForm.StopService(ServiceName: String): Boolean;
var
  pid: THandle;
begin
  pid := GetServiceProcessId(ServiceName, SERVICE_START_PENDING);
  // pid := GetServiceProcessId(ServiceName); // если нам всё равно, висит он или нет
  if pid <> 0 then // если процесс есть и он висит 
    TerminateProcess(OpenProcess(PROCESS_TERMINATE, false, pid), 0); // убить его, если прав хватит
  Result := pid <> 0;
end;


По сути это и есть
sc queryex SERVICENAME
taskkill /PID PROCESS_PID_NNN
PM MAIL   Вверх
Google
  Дата 20.10.2018, 07:23 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0845 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.