Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Про QueryServiceConfig2 - _SERVICE_FAILURE_ACTIONS


kami ©   (2005-11-09 23:07:00) 

Help, пожалуйста, а то никак не соображу :(

в mmc.exe в службах на закладке "Восстановление" отображается отдельно путь к запускаемой программе, отдельно - ее параметры и + "дописать в командную строку счетчик ошибок".
Не соображу, как "вычленить" из _SERVICE_FAILURE_ACTIONS.lpCommand отдельно параметры командной строки и отдельно это "дописать..."

Ко всему вышесказанному - это что же, просматривать список _SERVICE_FAILURE_ACTIONS.lpsaActions отдельно для определения, будет ли служба вообще перезапускаться (отобразить, через какое время) и отдельно для определения - будет ли запускаться программа (тоже, чтобы отобразить это) ?


kami   (2005-11-11 13:19:00) [1]

Набережных С. ©   (11.11.05 9:11) [8]
Понятно, спасибо большое.


Набережных С.   (2005-11-11 09:11:00) [2]


> kami ©   (11.11.05 08:52) [7]

Насколько мне известно - глюк, благополучно перекочевавший из W2kPro.
Хотя я особо не интересовался, W-версия работает, и ладно:)


kami   (2005-11-11 08:52:00) [3]

Прошу прощения - клиент форума что-то глюканул, видел только первые 4 поста.

Набережных С. ©   (10.11.05 19:47) [6]
Ого !!! :))
Все получилось. А почему так ? В смысле, это мои кривые руки или что-то (с надеждой в голосе :-) ) MS намудрил ?


Набережных С.   (2005-11-10 19:47:00) [4]

QueryServiceConfig2W


Набережных С.   (2005-11-10 19:47:00) [5]

В смысле, используй QueryServiceConfig2W :))


kami   (2005-11-10 19:06:00) [6]

Остановился пока на получении значений из реестра - но мне это очень не нравится :(


kami   (2005-11-10 19:04:00) [7]

umbra ©   (10.11.05 18:40) [2]
Пробовал и Packed record - эффект тот же


umbra   (2005-11-10 18:40:00) [8]

а может TServiceFailureActionsдолжна быть packed record?
просто предположение


kami   (2005-11-10 16:54:00) [9]

Памагите, пожалуйста...

теперь вообще ничего не понимаю... У меня D5, в ней нет Query & ChangeServiceConfig2 и их структур... Пришлось самому определить. Проблема в том, что, при получении TServiceFailureActions.lpCommand и lpRebootMSG из QueryServiceConfig2 - исчезают первые от 10 до 25 символовв этих строках.
Подскажите, что я делаю не так? Вроде, все объявил,как положено...
type
 // объявление структур
 TSCActionType=DWORD;
 TSCAction=record
   SCAction:TSCActionType;
   Delay:DWord;
 end;

 pSCActions=^TSCActions;
 TSCActions=array [0..2] of TSCAction;

 pServiceFailureActions=^TServiceFailureActions;
 TServiceFailureActions=record
   dwResetPeriod:DWord;
   lpRebootMsg:PChar;
   lpCommand:PChar;
   cActions:DWord;
   lpsaActions:pSCActions;
 end;
// и функций
function QueryServiceConfig2(hHandle:THandle;dwInfoLevel:DWord;buffer:pServiceFailureActions;
       cbBufSize:DWord;var pcbBytesNeeded:DWord):BOOL;stdcall;
         external 'Advapi32.dll' name 'QueryServiceConfig2A' ;
function ChangeServiceConfig2(hService:THandle;dwInfoLevel:DWORD;lpInfo:Pointer):BOOL;stdcall;
         external 'advapi32.dll' name 'ChangeServiceConfig2A' ;


код :
procedure TForm1.Button1Click(Sender: TObject);// изменение параметров _Service_Failure_Actions сервиса
var
 hSC,hServ:THandle;
 p:pServiceFailureActions;
 pActions:pSCActions;
 i:bool;
begin
 hSC:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
 hServ:=OpenService(hSC,'Alerter',SERVICE_ALL_ACCESS);// открываем сервис "Оповещатель" (к примеру)

 GetMem(pActions,SizeOf(TSCActions));
 pActions^[0].SCAction:=SC_ACTION_RUN_COMMAND;
 pActions^[0].Delay:=0;
 
 GetMem(p,8192);
 p.lpRebootMsg:=nil;// не меняем
 p.dwResetPeriod:=0;
 p.lpCommand:='F:\FirstNeed\System\ProcessExplorer\procexp.exe';
 p.cActions:=1;
 p.lpsaActions:=pActions;

 i:=ChangeServiceConfig2(hServ,2,p);// отрабатывает нормально, в mmc.exe выводится все, что задал
 if not i then
   ShowMessage(IntToStr(GetLastError));

 FreeMem(pActions);
 FreeMem(p);
end;

procedure TForm1.Button2Click(Sender: TObject);// отображение изменений
var
 hSC,hServ:THandle;
 p:pServiceFailureActions;
 i:Cardinal;
 b:Bool;
begin
 hSC:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
 hServ:=OpenService(hSC,'Alerter',SERVICE_ALL_ACCESS);

 GetMem(p,8192);// максимальный допустимый размер этой структуры
 b:=QueryServiceConfig2(hServ,2,p,8192,i);//вот здесь "исчезают" начальные символы из p.lpCommand, отображаемые в mmc.exe
 if not b then
   ShowMessage(IntToStr(GetLastError))
 else
   Form1.Caption:=p.lpCommand;

 FreeMem(p);
 CloseServiceHandle(hServ);
 CloseServiceHandle(hSC);
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо