Windowsサービスプログラムに奇妙なエラーが表示されます。私のサービスプログラムはStartServiceCtrlDispatcher()
の最初にmain()
を呼び出しますが、1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
で失敗することがあります。
ユーザーが(コンソールプログラムとして)プログラムを手動で起動すると、このエラーが発生します。ただし、そうではありません。このエラーが発生したときに、サービスプログラムの親プロセスをチェックするコードを追加しました、services.exeが親プロセスであることを通知します(私のプログラムがSCMによって適切に起動されたと想定しても安全です)。
残念ながら、このエラーは私の開発マシンでは再現されず、自分でデバッグすることはできませんが、ユーザーシステムでキャプチャされたエラーログは次のように伝えています。
StartServiceCtrlDispatcher()
は約1秒間停止してから失敗して戻ります。誰かが同様のエラーを見たことがありますか?その場合、エラーの原因は何でしたか?
回答がないことやgoogleに何かがあることからすでにわかるように、問題は一般的ではありません。問題はあなたのサービスにあると思います、そしてそれはプロセスの最初からStartServiceCtrlDispatcher()
まで実行されたコードにあり、そしておそらくそれは何らかの形の破損したシステムリソース、おそらくヒープまたはHANDLE
をとります。
あなたはこれを聞いて申し訳ありませんが、私はあなたの問題に魔法の答えをするつもりはありません。代わりに、いくつかのトラブルシューティングを提案できます。
Microsoft Application Verifierは、破損の発見に非常に役立ちます。私はあなたに以下を提案します:
Basics\Heaps
_のみを選択します。Basics\Handles
_を追加します。 _Basics\Heaps
_とは異なり、これは「誤検知」を引き起こすことがあります。とにかく、あなたは狩りをしているので、見つけたものすべてを修正した方がいいでしょう。私は、HANDLE
またはそのようなものを二重に解放することについて主に心配しています。サービスマネージャHANDLE
を誤って解放すると、問題が発生する可能性があります。Basics\*
_の他のオプションを試すことができますが、それが役に立たないと思います。main()
とStartServiceCtrlDispatcher()
の間のコードと、使用できるすべてのグローバルコンストラクターを検査することができます。 HANDLE
で潜在的なバッファオーバーフローとエラーを探します。ヒント:_wfopen/fwrite/fcloseを使用していくつかのメッセージをログに記録しました。どういうわけか183が内部でスローされ、この失敗1063につながっていました。ロギングを削除したところ、何も起こらなかったため、正常に動作し始めました。どんな小さなエラーもそれにあなたを導くかもしれません。サービスから開始すると、賃金エラー(私の場合は183)がリストされます。