![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сервис и реестр [D6, WinXP]
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 файлу.. неработает именно при установленном сервесе и загрузки компьютера.. :)