7

MingW で Windows サービスを構築しようとしています。スレッド セーフな例外が必要なので、リンカー フラグ-mthreadsを追加しました。アプリケーションはコマンドラインから正常に動作しますが、 services.mscから開始しようとすると、1054 エラー (「サービスは開始または制御要求にタイムリーに応答しませんでした」) が発生します。-mthreadsフラグなしで再ビルドすると、サービスが開始されます。-mthreadsでこれを機能させるにはどうすればよいですか?

4

4 に答える 4

5

-mthreads が DLL への依存関係をもたらしていると思われます。その DLL は、サービスとして実行されているときにパス上にありません。私の cygwin 環境では、"-mno-cygwin -mthreads" を指定して簡単なプログラムをコンパイルすると、MINGWM10.DLL への依存関係が発生します。これは、サービスとして実行する場合、パス上にないことは確かです。PATH を設定せずに実行しようとすると、ロードの開始時にクラッシュします (アプリケーション イベント ログに糞が残ります)。

Dependency Walker ( http://www.dependencywalker.com )で exe を起動して、読み込み時に何を読み込んでいるかを確認し、Windows イベント ログをチェックして、ヒントがあるかどうかを確認します。おそらく、必要な DLL のコピーを実行可能ファイルと一緒に配置する必要があります。

于 2009-09-23T05:19:00.477 に答える
2

-mthread オプションでコンパイルされた C++ プログラムにはその依存関係があるため、作業ディレクトリまたは [編集: システム、ユーザーごとではなく] PATH に mingwm10.dll が必要です。コードによって例外がスローされたり、スタックを介して伝搬されたりしないことが確実な場合は、-mthread の代わりに -fno-exception を使用して依存関係を解決します。

于 2010-01-25T07:47:43.827 に答える
1

サービスとして実行するときにデバッグできるかしら。サービスホストがプログラムを実行するときに、プログラムを不気味なものにする必要があります。おそらく、デバッガーをsvchost.exeに接続してみてください。少なくとも、ロードされているモジュールと、クラッシュの原因となる例外を確認できます。

于 2009-09-17T02:27:52.377 に答える
1

アプリケーションはまったく起動していませんか?OutputDebugString関数の先頭に(または同等の)呼び出しを入れて、mainそれがそこまで到達するかどうかを確認します。(まだ持っていない場合は、 SysInternalsDbgViewから入手してください。)

それほど遠くない場合は、明らかなチェックを開始します。アプリケーションがランタイムDLLを見つけられないのは問題ですか?PATHに通常のランタイムがある可能性がありますが、MTバージョンが見つかりません。それはあなたが説明する行動を説明するかもしれません。MTランタイムをコピーするか、それに応じてPATHを更新する必要がある場合があります。

于 2009-09-21T09:56:26.147 に答える