Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как заставить сервис ловить системные сообщения?


Автор: danilsl 13.7.2007, 12:53
Привет всем.
Пишу Service Application. Во время работы этот сервис должен будет размножать потоки. Для корректного завершения потоков я хочу в последней строке потока отправлять системное сообщение основному потоку сервиса, для уведомления его о том, что поток нужно добить. В сервисе прописан такой код:
Код

unit Main;

interface

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

const
  WM_MY_MSG = WM_APP+5000;

type
  TTestSrv = class(TService)
    procedure ServiceStart(Sender: TService; var Started: Boolean);
  private
    { Private declarations }
    procedure ProcMsg(var Msg:TMessage); message WM_MY_MSG;
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  TestSrv: TTestSrv;

implementation

{$R *.DFM}

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

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

procedure TTestSrv.ProcMsg(var Msg: TMessage);
begin
  ShowMessage('Good');
end;

procedure TTestSrv.ServiceStart(Sender: TService; var Started: Boolean);
begin
  ShowMessage(IntToStr(TestSrv.ServiceThread.Handle));
end;

end.


Сообщения сервису посылаю пока из внешней проги. Пробовал и PostMessage и SendMessage и PostThreadMessage. В качестве хендла подсовывал им TestSrv.ServiceThread.Handle, не помогло. Попробовал подсовывать то что пишет про этот сервис WinSight из 7-й дельфи, тоже ноль реакции.
Что ещё можно сделать?
ЗЫ TestSrv.ServiceThread.Handle вычислял в обработчике OnServiceStart через всё тот же ShowMessage, взаимодействие с рабочим столом у сервиса разрешено, так что ShowMessage теряться не может.

Автор: fse 1.10.2007, 11:01
Что-то у меня сомнение на счёт TestSrv.ServiceThread.Handle! Это, я думаю, дескриптор потока, а не окна. Ты скорее всего отсылаешь месаги вникуда.
Можно сделать так: создай окно CreateWindow. И обрабатывай им сообщения (вынеси для него WndProc). Окно это могут искать сторонние проги при помощи FindWindow.
Так всё должно получиться наверняка.

Автор: Alix 1.10.2007, 15:26
Цитата
Сообщения сервису посылаю пока из внешней проги. 

никак не прокатит. 

почитай свою же тему http://forum.vingrad.ru/forum/topic-170496.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)