サービスのインストール (SC CREATE を使用)、開始 ( 「Delphi for Windows 8 で Windows サービスを開始する方法」の回答にあるものと非常によく似たコードを使用)、サービスの停止とアンインストールを可能にするサービス マネージャー アプリケーションを作成しました。
このサービスは、Delphi で記述された Windows サーバー exe アプリです。
突然 (数日前)、特定のマシン (Windows Server 2012R2) でサービスを開始できなくなりました。これは、Windows サービス コンソールからではなく、アプリケーションからの両方で発生します。
同じexe(マネージャーとサービス)が他のマシン(特に別のWindows Server 2012R2と私のWindows 10ワークステーション)で正常に動作します。
これは私が「測定」したものです:
1) サービスを開始しようとすると、このコードStartService(schs,0,psTemp)
(WinAPI 呼び出し - 上記のリンクを参照) は true を返しません。
2) dpr にOutpuDebugString
メッセージを入れると、 DebugView でそれらを見ることができません。つまり、サービス exe が開始されていません。
3) Windows システム イベント ロガーでは、サービスに接続しようとしているときに 30 秒のタイムアウトがあることがわかります。
4)何かを書くだけのダミーのservice.exeを作成しても、OutpuDebugString
起動できません
これはダミー サービスの実装です。
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
Dummy.Controller(CtrlCode);
end;
function TDummy.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TDummy.ServiceAfterInstall(Sender: TService);
begin
OutputDebugString('ServiceAfterInstall');
end;
procedure TDummy.ServiceAfterUninstall(Sender: TService);
begin
OutputDebugString('ServiceAfterUninstall');
end;
procedure TDummy.ServiceBeforeInstall(Sender: TService);
begin
OutputDebugString('ServiceBeforeInstall');
end;
procedure TDummy.ServiceBeforeUninstall(Sender: TService);
begin
OutputDebugString('ServiceBeforeUninstall');
end;
procedure TDummy.ServiceExecute(Sender: TService);
var
cnt : Integer;
begin
cnt :=0;
while not Terminated do
begin
inc(CNT);
OutputDebugString(Pwidechar('ServiceExecute Count '+IntTOstr(Cnt)));
Sleep(1000);
ServiceThread.ProcessRequests(False);
end;
end;
procedure TDummy.ServiceStart(Sender: TService; var Started: Boolean);
begin
OutputDebugString('ServiceStart');
end;
procedure TDummy.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
OutputDebugString('ServiceStop');
end;
この特定のマシンでは、2 週間前にサービスを開始できましたが、特に何もしていません。
もっとデバッグするために何ができるのだろうか、私は立ち往生しています。
タイムアウトが発生するのはなぜですか。サービス exe が開始されていないようです ( OutputDebugString
DebugView にメッセージが表示されると思われる場合)。
これは、数日前までは正常に実行されていた 1 台のマシンでのみ発生します。
助けてくれる人に感謝します!