![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уважаемые мастера подскажите плиз, как в сервисе установить [D6, D7, Win2k]
Alibaba © (2004-05-28 08:30:00)RegisterWindowMessage,
я делаю так
type
Tlogo = class(TService)
procedure DefaultHandler(var Message); override;
private
public
end;
var
logo: Tlogo;
fmsg:integer;
procedure Tlogo.DefaultHandler(var message);
begin
with TMessage(message) do begin
if (msg = FMsg) then begin
messagebox(0, pchar('произошло'),pchar('что надо'),MB_SERVICE_NOTIFICATION);
end
else
inherited DefaultHandler(message);
end;
end;
initialization
FMsg := RegisterWindowMessage('TaskbarCreated');
что то не работает ? :-(
Alibaba (2004-05-28 10:44:00) [21]выдается сообщение сервис создан и сообщение о том что обнаружена ошибка и приложение будет закрыто
Alibaba (2004-05-28 10:43:00) [22]выдается сообщение сервис стартанул и сообщение о том что обнаружена ошибка и приложение будет закрыто
Alibaba (2004-05-28 10:32:00) [23]type
Tlogo = class(TService)
procedure MyWindowProc(var Message: TMessage);
procedure ServiceCreate(Sender: TObject);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
private
public
FWnd: THandle;
end;
var
logo: Tlogo;
fmsg:integer;
implementation
{$R *.DFM}
procedure Tlogo.ServiceCreate(Sender: TObject);
begin
messagebox(0, pchar('service'),pchar('create'),MB_SERVICE_NOTIFICATION);
end;
procedure Tlogo.ServiceStart(Sender: TService; var Started: Boolean);
begin
messagebox(0, pchar('start'),pchar('service'),MB_SERVICE_NOTIFICATION);
FWnd := AllocateHWnd(MyWindowProc);
messagebox(0, pchar('start'),pchar('service'),MB_SERVICE_NOTIFICATION);
end;
procedure Tlogo.MyWindowProc(var Message: TMessage);
begin
if (message.Msg = FMsg) then begin
messagebox(0, pchar('произошло'),pchar('что надо'),MB_SERVICE_NOTIFICATION);
end ;
end;
procedure Tlogo.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
DeallocateHWnd(FWnd);
end;
делаю так, а он создается, но не хочет запускаться :-(
Digitman (2004-05-28 10:04:00) [24]
> т.е мне сначала необходимо создать форму?
ну почему обязательно форму ? достаточно просто окно создать, например, вызовом ф-ции AllocateHWND()
создать окно можно в OnStart, уничтожить - в OnStop
если не назначать обработчик OnExecute, диспетчеризация оконных сообщений происходит автоматически, все что требуется - просто при вызове AllocateHWND() передать ей параметром адрес метода, который будет вызываться всякий раз при получении окном любого адресованного ему сообщения
Tlogo = class(TService)
FWnd: THandle;
..
procedure MyWindowProc(var Message: TMessage);
..
end;
procedure Tlogo.MyWindowProc(var Message: TMessage);
begin
if (msg = FMsg) then begin
messagebox(0, pchar('произошло'),pchar('что надо'),MB_SERVICE_NOTIFICATION);
end ;
end;
в Tlogo.OnStart:
FWnd := AllocateHWnd(MyWindowProc);
в Tlogo.OnStop:
DeallocateHWnd(FWnd);
Alibaba (2004-05-28 09:31:00) [25]т.е мне сначала необходимо создать форму?
ок, а когда мне ее лудше создать, при создании сервиса или при старте?
Digitman (2004-05-28 09:14:00) [26]
> что то не работает
и не будет это работать, потому что сообщение это, будучи посланным, адресовано верхнеуровневым окнам десктопа, а у тебя сервис, очевидно, никаких окон не создает
ко всему прочему, передача управления на DefaultHandler() произойдет лишь тогда, когда где-либо будет вызван метод Tlogo.Dispatch() ... а этот метод никто кроме тебя самого не вызовет