サービスアプリケーションを作りたいのですが、最初の一歩でつまずいてしまいました。
テスト用に起動/停止したらビープ音が鳴るテストを作り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.
あ、サービススタートとストップに
Started := True;
Sttopped := True;
を書き忘れていましたが、結果は同じで呼び出されずに勝手に終了してしまいました。
自己解決しました。
・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.