Консультация № 75707
14.02.2007, 15:34
0.00 руб.
0 2 2
Здравствуйте, уважаемые эксперты!
Вопрос мой связан в большей части в реестром, но и имеет смысл и в этой рассылке.
Значит думал я над тем, как бы мне запускать мои программы при автозагруке, да притом так, чтобы об этом никто ничего и не подозревал...
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun как-то выглядит слишком заметно...
Покопавшись по реестру, я заметил, что некоторые приложения запускаются как сервисы.
Кстати, заметил там троянчика, который под видом "сервиса", да еще с таким незаметным названием Win32 Service в свое время портил мне всю работу в Интернете.
Конечно, его я удалил, а его следы остались.
Не долго думая, я поменял параметр ImagePath в ветке HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesWin32 Login
(у Вас такого может и не быть, но суть записанного в этом разделе являлась аналогичной всем остальным сервисам) на путь к моей программе, сделанной в Delphi.
Так вот, при запуске все запускается и в течении пяти секунд работает, и, затем обрубается, хотя задумка была такой, чтобы программа висела постоянно в памяти.
Зайдя в локальные службы (Пуск=>Выполнить=>services.msc), нашел я там свой сервис и нажал "Пуск". Немного подождав, оно мне отвечает: "Не удалось запустить службу ... Ошибка 1053: Служба не ответила на запрос своевременно".
Внимание, вопрос:
Какое сообщение передавалось в этот момент моей программе и какое мне нужно было отослать в качестве ответа? Вообщем, кто знает о том, как сделать все это рабочим, пожалуйста помогите!!!

Обсуждение

Неизвестный
14.02.2007, 15:42
общий
это ответ
Здравствуйте, Bingo!

Delphi - File - New - Other... - Service Application
Посмотрите, поиграйтесь... Вот только отлаживать из-под Delphi будет непросто, и если сделаете что-то непоправимое - может быть больно, вплоть до переустановки системы.
Неизвестный
14.02.2007, 16:21
общий
это ответ
Здравствуйте, Bingo!
Вот вполне рабочий сервис.

Свойства сервиса:

DisplayName = My service
ErrorSeverity = esNormal
Name = MyService
OldCreateOrder = False
ServiceType = stWin32
StartType = stAuto
WaitHint = 5000

Сам юнит:

unit MyServiceUnit;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;

type
TMyService = class(TService)
procedure ServiceExecute(Sender: TService);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServiceShutdown(Sender: TService);
private
public
function GetServiceController: TServiceController; override;
end;

var
MyService: TMyService;

implementation

{$R *.DFM}

function IsRunningInInstallMode : Boolean;
function FindSwitch(const Switch: string): Boolean;
begin
Result := FindCmdLineSwitch(Switch, [‘-‘, ‘/‘], True);
end;
begin
Result := FindSwitch(‘INSTALL‘) or FindSwitch(‘UNINSTALL‘);
end;

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
MyService.Controller(CtrlCode);
end;

function TMyService.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;

procedure TMyService.ServiceExecute(Sender: TService);
begin
if not IsRunningInInstallMode then SvcMgr.Application.Initialize;
while not Terminated do ServiceThread.ProcessRequests(True);
end;

procedure TMyService.ServiceStart(Sender: TService; var Started: Boolean);
begin
Started := True;
ReportStatus();
end;

procedure TMyService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
Stopped := True;
ReportStatus();
end;

procedure TMyService.ServiceShutdown(Sender: TService);
begin
Status := csStopped;
ReportStatus();
end;
Форма ответа