以下を使用するWindowsサービスがあります。
- Midas.dll(datasnap ClientDataSet)
- Indyコンポーネント(TCPおよびFTP)
- DbExpress
- CreateProcessAsUser
- IPCを作成するためのハンドル
一部のマシン(古いハードウェアとWindows XPを搭載)では、起動中にハングアップします。
Windowsのイベントログを確認すると、イベントIDが7022、7036であることがわかりました。
マシンの起動後、手動でサービスを開始すると、すべてうまくいきます。
問題は、サービスへの依存関係の欠落に関連していると思います。
私の質問は:
サービスに必要な依存関係を見つけるにはどうすればよいですか?
これを教えてくれるユーティリティはありますか?
アップデート
私はすでにログを持っています...
私のサービスは、プラグインと呼ばれるいくつかの「サブサービス」によってプラグイン可能です。このプラグインは、サービスメモリの分離を保証するためにdllをロードするアプリケーション(exe)である「プラグインマネージャー」で始まります。
このプラグインマネージャーには、サービスから(sendmessangeを介して)メッセージを受信できるようにするためのハンドル(AllocateHWnd)があります。
- 始める
- プラグインライブラリをリロード
- 止まる
プラグインマネージャーのブートストラップは次のとおりです。
- 開始してサービスのハンドルにメッセージを送信し(パラメーターを介して渡されます)、サービスとプラグインマネージャーの間でIPCに内部的に(プラグインマネージャーによって)割り当てられたハンドルをサービスに送り返します。
プラグインマネージャーを起動するサービスのブートストラップコードは次のとおりです。
start := now;
while callbackHandle = 0 do
begin
if PeekMessage(msg, 0, 0, 0, PM_REMOVE) then
begin
// need to process a message on WndProc to
// assign the 'callbackHandle' variable with the
// handle sent from the plugin manager
TranslateMessage(msg);
DispatchMessage(msg);
end;
// timeout! Plugin manager doesn't sent it's handle!!
if secondsBetween(now, start) > 60 then
break;
end;
if callbackHandle = 0 then
raise Exception.Create('Cannot receive the callback handle from plugin manager');
ログで、上記の例外が発生します:プラグインマネージャーからコールバックハンドルを受信できません
IPC(プロセス間通信)を開始するために、サービスハンドルがpluginmanagerハンドルを受け取らないようです。
奇妙なことに、コンピュータの起動後に手動でサービスを開始すると、正常に開始されます。