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

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

Сервис и реестр [D6, WinXP]


Страницы:   1 2

Avgust ©   (2006-09-15 13:05:00) 

проблема с сервисом, при запуске компьютера должен лесть в реестр и прописывать нужные ключи... при инсталяции и деинсталяции сервиса всё нормально.. в реестр изменения вносятся.. но вот при старте компьютера нет, пробовал делать изменения на создание сервиса и на старт сервиса.. изменения не происходят.


Ketmar   (2006-09-28 14:42:00) [1]

ну вот тебе пример. только что проверил -- работат "на ура".
{$APPTYPE GUI}
{$I-}
program stezt;

uses
 Windows, WinSvc, SysUtils, Registry;

var
 serviceName: PChar = '';
 status: TServiceStatus;
 statusHandle: SERVICE_STATUS_HANDLE;
 serviceTable: packed array [0..1] of TServiceTableEntry;
 stopped: Boolean;
 paused: Boolean;

procedure ServiceMain ();
var
 r: TRegistry;
begin
 repeat
   if not paused then
   begin
     r := nil;
     try
       r := TRegistry.Create();
       r.RootKey := HKEY_LOCAL_MACHINE;
       if r.OpenKey('software\av0', true) then
       begin
         r.WriteInteger('intvalue', Random(65536));
       end;
     except
     end;
     FreeAndNil(r);
     Sleep(1000);
   end;
 until stopped;
end;

procedure ServiceCtrlHandler(Control: dword); stdcall;
begin
 case Control of
   SERVICE_CONTROL_STOP:
     begin
       stopped := True;
       status.dwCurrentState := SERVICE_STOP_PENDING;
       SetServiceStatus(statusHandle, status);
     end;
   SERVICE_CONTROL_PAUSE:
     begin
       paused := True;
       status.dwcurrentstate := SERVICE_PAUSED;
       SetServiceStatus(statusHandle, status);
     end;
   SERVICE_CONTROL_CONTINUE:
     begin
       paused := False;
       status.dwCurrentState := SERVICE_RUNNING;
       SetServiceStatus(statusHandle, status);
     end;
   SERVICE_CONTROL_INTERROGATE: SetServiceStatus(statusHandle, status);
   SERVICE_CONTROL_SHUTDOWN: stopped := True;
 end;
end;

procedure ServiceCtrlDispatcher(dwArgc: dword; var lpszArgv: PChar); stdcall;
begin
 statusHandle := RegisterServiceCtrlHandler(serviceName, @ServiceCtrlHandler);
 if statusHandle <> 0 then
 begin
   ZeroMemory(@status, SizeOf(status));
   status.dwServiceType := SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS;
   status.dwCurrentState:= SERVICE_START_PENDING;
   status.dwControlsAccepted := SERVICE_ACCEPT_STOP or SERVICE_ACCEPT_PAUSE_CONTINUE;
   status.dwWaitHint := 1000;
   SetServiceStatus(statusHandle, status);
   stopped := False;
   paused := False;
   status.dwCurrentState := SERVICE_RUNNING;
   SetServiceStatus(statusHandle, status);
   ServiceMain;
   status.dwCurrentState := SERVICE_STOPPED;
   SetServiceStatus(statusHandle, status);
 end;
end;

procedure UninstallService(serviceName: PChar);
var
 SCManager: SC_HANDLE;
 Service: SC_HANDLE;
begin
 SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
 if SCManager = 0 then Exit;
 try
   Service := OpenService(SCManager, serviceName, SERVICE_ALL_ACCESS);
   ControlService(Service, SERVICE_CONTROL_STOP, status);
   DeleteService(Service);
   CloseServiceHandle(Service);
 finally
   CloseServiceHandle(SCManager);
 end;
end;

procedure InstallService(serviceName, DisplayName: PChar; fileName: string);
var
 SCManager: SC_HANDLE;
 Service: SC_HANDLE;
 Args: PChar;
begin
 SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
 if SCManager = 0 then Exit;
 try
   Service := CreateService(SCManager, serviceName, DisplayName,
     SERVICE_ALL_ACCESS,
     SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,
     SERVICE_AUTO_START,
     SERVICE_ERROR_IGNORE,
     PChar(fileName), nil, nil, nil,
     nil, nil);
   if Service = 0 then
     //MessageBox(0, 'error installing service', 'xkit error', 0)
   else
   begin
     Args := nil;
     StartService(Service, 0, Args);
   end;
   CloseServiceHandle(Service);
 finally
   CloseServiceHandle(SCManager);
 end;
end;

begin
 serviceName := 'tezzzt';
 if ParamStr(1) = '/i' then
 begin
   //MessageBox(0, 'installing service', 'xkit', 0);
   InstallService(serviceName, 'tezzzt1', ParamStr(0));
 end
 else if ParamStr(1) = '/u' then
 begin
   //MessageBox(0, 'uninstalling service', 'xkit', 0);
   UninstallService(serviceName);
 end
 else
 begin
   serviceTable[0].lpServiceName := serviceName;
   serviceTable[0].lpServiceProc := @ServiceCtrlDispatcher;
   serviceTable[1].lpServiceName := nil;
   serviceTable[1].lpServiceProc := nil;
   StartServiceCtrlDispatcher(serviceTable[0]);
 end;
end.


Avgust   (2006-09-28 14:20:00) [2]


> ты по колесу от "запорожца" сможешь неисправность двигателя
> диагностировать


ты прикалываешься?...
это весь код.. это полностью рабочий код.. больше нету ничего..

вставлял его на старт сервиса.. на его создание.. карочи на все события ставил.. но как только я устанавливаю этот сервис сервисом.. то всё.. запись в реестр непроисходит.


Ketmar   (2006-09-28 14:14:00) [3]

>[20] Avgust 28-Sep-2006, 14:09
> в 10-ом посте этот код.. куда его ещё меньше
>делать?...
это не код. это обломок. ты по колесу от "запорожца" сможешь неисправность двигателя диагностировать?


Avgust   (2006-09-28 14:09:00) [4]


>  сократи код до минимума и покажи. тогда будем думать предметно.


в 10-ом посте этот код.. куда его ещё меньше делать?...


Ketmar   (2006-09-28 14:06:00) [5]

>[18] Avgust 28-Sep-2006, 13:59
>но плиз.. харе стебаца.. я просто админ
>и програмлю как любитель..
хватит плакать. тебе ж намекнули -- сократи код до минимума и покажи. тогда будем думать предметно.


Avgust   (2006-09-28 13:59:00) [6]


> А какой у тебя тип сервиса? и где вызывается этот код?


stWin32

да везде пробовал и на создании и на запуске...

зы.. я понимаю что большенство сдесь кульных программёрав и никакда у них не вазникает проблем.. но плиз.. харе стебаца.. я просто админ и програмлю как любитель..


Elen   (2006-09-28 13:30:00) [7]


> Ketmar

По секрету всему свету. Ато Света сама нагрянет...


Ketmar   (2006-09-28 13:25:00) [8]

>[15] Elen(c) 28-Sep-2006, 13:22
>А какой у тебя тип сервиса? и где вызывается этот код?
т-с-с-с. это секрет. автор не скажет.


Elen   (2006-09-28 13:22:00) [9]


> Avgust

А какой у тебя тип сервиса? и где вызывается этот код?


Ketmar   (2006-09-28 13:18:00) [10]

>[13] Avgust 28-Sep-2006, 13:14
>хм.. а может это невозможно?..
однозначно. а остальные это делают при помощи некромантии.


Avgust   (2006-09-28 13:14:00) [11]

хм.. а может это невозможно?..


Avgust   (2006-09-28 10:45:00) [12]


> с каких пор это одно и то же?


не пишит  в HKEY_CURRENT_USER и в HKEY_LOCAL_MACHINE разрешение system на запись есть везде.. но не пишит и всё..


Ketmar   (2006-09-28 08:09:00) [13]

>[10] Avgust 28-Sep-2006, 05:41
кросавчег. тебя что спрашивали? куда писать? в HKEY_LOCAL_MACHINE. а ты куда пишешь?
>   reg.RootKey:=HKEY_CURRENT_USER;
с каких пор это одно и то же?


Avgust   (2006-09-28 05:41:00) [14]


> Значит у тебя ошибка в программе)


ну вот смотри:

var
reg:TRegistry;
begin
  reg:=TRegistry.Create;
  reg.RootKey:=HKEY_CURRENT_USER;
  reg.OpenKey('\SOFTWARE\test',true);
  reg.WriteInteger('test',1);
  Reg.CloseKey;

всё работает как надо.. но после установки сервисом перестаёт..


Сергей М.   (2006-09-15 14:50:00) [15]

Значит у тебя ошибка в программе)
В 17-й строке)


Avgust   (2006-09-15 14:48:00) [16]


> Угу. Так , наверно, и говорит, мол, не пашу блин)


если ты про ошибки.. их нет... сам бы уже разобрался.. но нет ошибок.. логи чистые.


Сергей М.   (2006-09-15 14:35:00) [17]


> непашет блин (((((
>


Угу. Так , наверно, и говорит, мол, не пашу блин)


Avgust   (2006-09-15 14:28:00) [18]


> Давай-давай, продолжай рассуждать.


я не рассуждаю.. просто говорю что те задачи которые заложены выполняются.. но выполняются только при условии установки или удаления сервиса...

у меня поток запускается при создании сервиса.. так же пробовал его запускать при старте сервиса.. и по таймеру.. непашет блин (((((


Сергей М.   (2006-09-15 13:57:00) [19]


> Avgust   (15.09.06 13:52) [4]


Давай-давай, продолжай рассуждать.
А воз и ныне там)


Avgust   (2006-09-15 13:52:00) [20]


> у тебя ошибка в программе


хм... при установке сервисом или его удаления почемуто всё нормально срабатывает.. ну или просто клик по exe файлу.. неработает именно при установленном сервесе и загрузки компьютера.. :)


Страницы:   1 2

Наверх

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