MingW で Windows サービスを構築しようとしています。スレッド セーフな例外が必要なので、リンカー フラグ-mthreadsを追加しました。アプリケーションはコマンドラインから正常に動作しますが、 services.mscから開始しようとすると、1054 エラー (「サービスは開始または制御要求にタイムリーに応答しませんでした」) が発生します。-mthreadsフラグなしで再ビルドすると、サービスが開始されます。-mthreadsでこれを機能させるにはどうすればよいですか?
4 に答える
-mthreads が DLL への依存関係をもたらしていると思われます。その DLL は、サービスとして実行されているときにパス上にありません。私の cygwin 環境では、"-mno-cygwin -mthreads" を指定して簡単なプログラムをコンパイルすると、MINGWM10.DLL への依存関係が発生します。これは、サービスとして実行する場合、パス上にないことは確かです。PATH を設定せずに実行しようとすると、ロードの開始時にクラッシュします (アプリケーション イベント ログに糞が残ります)。
Dependency Walker ( http://www.dependencywalker.com )で exe を起動して、読み込み時に何を読み込んでいるかを確認し、Windows イベント ログをチェックして、ヒントがあるかどうかを確認します。おそらく、必要な DLL のコピーを実行可能ファイルと一緒に配置する必要があります。
-mthread オプションでコンパイルされた C++ プログラムにはその依存関係があるため、作業ディレクトリまたは [編集: システム、ユーザーごとではなく] PATH に mingwm10.dll が必要です。コードによって例外がスローされたり、スタックを介して伝搬されたりしないことが確実な場合は、-mthread の代わりに -fno-exception を使用して依存関係を解決します。
サービスとして実行するときにデバッグできるかしら。サービスホストがプログラムを実行するときに、プログラムを不気味なものにする必要があります。おそらく、デバッガーをsvchost.exeに接続してみてください。少なくとも、ロードされているモジュールと、クラッシュの原因となる例外を確認できます。
アプリケーションはまったく起動していませんか?OutputDebugString
関数の先頭に(または同等の)呼び出しを入れて、main
それがそこまで到達するかどうかを確認します。(まだ持っていない場合は、 SysInternalsDbgView
から入手してください。)
それほど遠くない場合は、明らかなチェックを開始します。アプリケーションがランタイムDLLを見つけられないのは問題ですか?PATHに通常のランタイムがある可能性がありますが、MTバージョンが見つかりません。それはあなたが説明する行動を説明するかもしれません。MTランタイムをコピーするか、それに応じてPATHを更新する必要がある場合があります。