1

Windows サービスとして設計された C++ Windows アプリケーションがあります。アップデーターを定期的に実行して、新しいバージョンがあるかどうかを確認します。アップデーターを実行するには、_execv()を使用します。アップデーターは新しいバージョンを探してダウンロードし、Windows サービスを停止し (これらのアクションはすべてログに記録されます)、ファイルを置き換えて、サービスを再開します。CLIモードで(サービスモードに入らないで)それを行うと、そのようにうまく機能します。私のログ ファイルによると、子プロセスは起動されますが、親プロセス (Windows サービス) は終了します。

Windowsサービスで子プロセスを起動することさえ「許可」されていますか?なぜサービスが予期せず終了するのですか? 私のログファイルにはエラーが表示されません(ログに書き込まれるセグメンテーション違反なども監視しています)。

4

2 に答える 2

1

_execv()Windowsの方法で使用するのではなく、なぜ使用しているのCreateProcess()ですか?

サービスにデバッグを入れて、サービスを呼び出すポイントを過ぎていないと思います_execv()か?

于 2010-12-09T16:04:04.643 に答える
1

_execv 既存のプロセスを、パラメータとして渡したファイルを実行する新しいプロセスに置き換えます。直接/ネイティブに処理される Unix (および同様の) の下。ただし、Windows はそれを直接サポートしていません。したがって、親プロセスを終了させ、子プロセスが開始されるとすぐに開始されるように手配することによって行われます。

IOW、それは設計どおりに動作しているように聞こえます_execvが、この場合、おそらくあなたが本当に望んでいるものではありません. サービスからプロセスを生成することはできますが、一般的CreateProcessAsUserには、サービス アカウントではなく、指定されたアカウントの下でプロセスを作成するために使用します (サービス アカウントにはかなり特殊な権限が割り当てられています)。ControlServiceアップデーターが、CreateServiceなどを呼び出したときに、サービス マネージャーから要求されると、サービス プロセスは終了して再起動します。

于 2010-12-09T16:06:43.580 に答える