サービスアプリケーションはどう作るのですか?

解決


かっぱ  2006-10-22 10:52:36  No: 23602  IP: 192.*.*.*

サービスアプリケーションを作りたいのですが、最初の一歩でつまずいてしまいました。
テスト用に起動/停止したらビープ音が鳴るテストを作りDelphiより実行させたのですが
    procedure ServiceExecute(Sender: TService);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
のいずれも呼び出されず、15秒ほどすると勝手に終了してしまいます。
単体で実行しても同じです。何がいけない、足らないのでしょうか?

「新規製作」−「サービスアプリケーション」−OnExecute,OnStart,OnStopのイベント追加を行いました。プロパティーは初期値のままです。
環境はDelphi6-Professional,WindowsXP-pro-SP2です。

unit Unit1;

interface

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

type
  TService1 = class(TService)
    procedure ServiceExecute(Sender: TService);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
  private
    { Private 宣言 }
  public
    function GetServiceController: TServiceController; override;
    { Public 宣言 }
  end;

var
  Service1: TService1;

implementation

{$R *.DFM}

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

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

procedure TService1.ServiceExecute(Sender: TService);
begin
  Beep;
end;

procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
  Beep;
end;

procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  Beep;
end;

end.

編集 削除
かっぱ  2006-10-22 11:39:23  No: 23603  IP: 192.*.*.*

あ、サービススタートとストップに
Started := True;
Sttopped := True;
を書き忘れていましたが、結果は同じで呼び出されずに勝手に終了してしまいました。

編集 削除
かっぱ  2006-10-22 15:09:38  No: 23604  IP: 192.*.*.*

自己解決しました。
・Delphiのデバッグ環境ではなくシステムにインストールして実行させる。

で出来ました。お騒がせしました。

解決ソース。タイマーを追加しています。

unit Unit1;

interface

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

type
  TService1 = class(TService)
    Timer1: TTimer;
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private 宣言 }

  public
    function GetServiceController: TServiceController; override;
    { Public 宣言 }
  end;

var
  Service1: TService1;

implementation

{$R *.DFM}

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

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

procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
  Timer1.Enabled := True;
  Started := True;
end;

procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  Timer1.Enabled := False;
  Stopped := True;
end;

procedure TService1.Timer1Timer(Sender: TObject);
begin
  Beep;
end;

end.

編集 削除