Windows Service
ウィザードを使用して新しいプロジェクトを作成し、コードを追加してコンパイルし、実行して/INSTALL
から、使用して開始しようとしnet start myservice
ましたが、service name not found
エラーが発生しました。次に、[サービス] の [コントロール パネル] に移動し、[開始] リンクをクリックしようとすると、表示されるダイアログ ウィンドウがプログレス バーの 50% で無期限にフリーズします。
開発中のメインシステムを更新するサービスを作るのはこれが初めての試みで、テスト用にTimer
1 分ごとに時刻を知らせる を入れました。何が間違っているのか、なぜそのように振る舞っているのか、誰でも気付くことができますか?
次のDPR
ファイル:
{...}
begin
if not Application.DelayInitialize or Application.Installing then
begin
Application.Initialize;
end;
Application.CreateForm(TZeusUpdateSevice, ZeusUpdateSevice);
Application.Run;
end.
および次のPAS
ファイル:
{...}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
ZeusUpdateSevice.Controller(CtrlCode);
end;
function TZeusUpdateSevice.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TZeusUpdateSevice.ServiceAfterInstall(Sender: TService);
var
regEdit : TRegistry;
begin
regEdit := TRegistry.Create(KEY_READ or KEY_WRITE);
try
regEdit.RootKey := HKEY_LOCAL_MACHINE;
if regEdit.OpenKey('\SYSTEM\CurrentControlSet\Services\' + Name,False) then
begin
regEdit.WriteString('Description','Mantém atualizados os arquivos e as credenciais da Plataforma Zeus.');
regEdit.CloseKey;
end;
finally
FreeAndNil(regEdit);
end;
end;
procedure TZeusUpdateSevice.ServiceStart(Sender: TService; var Started: Boolean);
begin
{ executa os processos solicitados pelo sistema }
Timer1.Enabled := True;
while not Terminated do ServiceThread.ProcessRequests(True);
Timer1.Enabled := False;
end;
procedure TZeusUpdateSevice.Timer1Timer(Sender: TObject);
begin
ShowMessage('Now, time is: ' + TimeToStr(Now));
end;