質問

サービス(別のデータを収集してレジストリに書き込むコンソールアプリ)から別のプロセスを起動しようとしていますが、何らかの理由で適切に起動できません。

私がやろうとしていることの基本は次のとおりです。

  1. プロセスを起動します
  2. プロセスが終了するのを待ちます
  3. プロセスからリターンコードを取得

現在、次のコードを使用しています:

STARTUPINFO info={sizeof(info)};
PROCESS_INFORMATION processInfo;
if (CreateProcess(PATH, ARGS, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
{
    ::WaitForSingleObject(processInfo.hProcess, INFINITE);

    DWORD exit = 100;
    GetExitCodeProcess(processInfo.hProcess, &exit);

    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);

    return exit;
}

CreateProcess()を呼び出すと、成功し、ifステートメントの本体に入ります。 WaitForSingleObjectの呼び出しはすぐに戻りますが、プロセスが完了するまでに約20〜30秒かかるため、そうではありません。そして最後に、GetExitCodeProcess()の呼び出しは失敗し、値" exit"を設定しません。

FYI、これは実際にサービスでではなく、他の場所で成功して使用しているコードです。

サービスから起動されているのに、許可の問題があるのでしょうか?

編集:アプリを実際に起動することに気付きました(TaskManで確認できます)が、行き詰まっているようです。ありますが、何もしていません。
Rob Kennedyの提案に基づいて、プロセスハンドルの問題を修正し、実際にプロセスが終了するまで待機します。ただし、手動で強制終了しない限り、終了することはありません。

役に立ちましたか?

解決

WaitForSingleObject および GetExitCodeProcess では、プロセスハンドルへのポインターではなく、プロセスハンドル自体が必要です。アンパサンドを削除します。

また、戻り値を確認し、失敗したときに GetLastError を呼び出します。これは、将来の問題を診断するのに役立ちます。 API関数が常に成功すると仮定しないでください。

関数を正しく呼び出して、新しいプロセスが開始しても進行しない場合、このコードが原因ではないことを合理的に確信できます。問題は新しいプロセスにあるので、サービスプロセスではなくデバッグタスクに集中してください。

他のヒント

更新と編集に続いて、これはサービスからプロセスを起動するときの多くの可能性のある落とし穴の1つに聞こえます。外部プロセスがユーザーの操作を待機している可能性はありますか、なんでもありますか?私が考えることができる3つの主要な例があります。たとえば、ある状況ではキーボード入力が必要なコマンドラインアプリケーションです(たとえば、" cmd / c del *。*"のようなものはユーザーの確認が必要です) 。他の例は、アプリケーションがウィンドウを必要とし、表示しているが表示できない場合に適用されます。その場合、サービスを「デスクトップと対話する」に設定することをお勧めします。デバッグ中に、アプリケーションウィンドウ(またはDLLが見つからないなどの予期しないWindowsエラーメッセージなど)を表示できるようになります。

これがデバッグに役立つかどうか、通常は「a-ha!」瞬間は、環境変数、パス、現在のディレクトリなどのようなものがおそらくサービス内で期待するものではないことを認識することから来ます。許可は、この種の問題の最も一般的な理由ではありません。起動しようとしている外部アプリケーションについての詳細を教えてください。これはおそらく考え抜くのに役立つでしょう。

コンソールアプリを起動しているため、コンソールを初期化しようとする非表示のスタートアップコードが存在する可能性があります。サービスはデスクトップにアタッチされていません。また、サービスによって起動されるプロセスもそうではないので、コンソールを作成することはできません。それがぶら下がっている可能性があります。

可能であれば、プロセスを完全なWindows実行可能ファイルに変更してみてください。ただし、ウィンドウを作成しようとする部分はスキップしてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top