2

以下を使用する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ハンドルを受け取らないようです。

奇妙なことに、コンピュータの起動後に手動でサービスを開始すると、正常に開始されます。

4

2 に答える 2

1

メッセージキューの処理時間は問題ではありませんでした。問題は次のとおりでした:遅いハードウェア

ServicePipeTimeoutを30秒(デフォルト)から2分に増やしたところ、すべてが正常に戻りました。

次に、サービスのOnStartイベントでRequestAdditionalTimeを使用してみます 。唯一の問題は、Delphi7を使用していることです。

于 2013-03-12T18:34:02.543 に答える
0

開始する最も簡単な方法は、サービスにロギングメカニズムを実装することです。実行していることをすべてに書き込むだけですTextFile。そうすれば、サービスがどこでハングしているのかを簡単に見つけることができます。

何と繋がっていDBExpressますか?SQL Serverのようなデータベースエンジン?その場合は、おそらくRDBMSの前にサービスが開始されています...

于 2013-03-11T12:41:32.327 に答える