2

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

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

  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」を設定しません。

参考までに、これは私が実際に他の場所で成功して使用したコードであり、サービスではありません。

サービスから起動されており、権限の問題がある可能性がありますか?

編集: 実際にアプリを起動することに気づきましたが(TaskManで確認できます)、スタックしているようです。そこにありますが、何もしていません。
Rob Kennedyの提案に基づいて、プロセスハンドルの問題を修正しましたが、実際にはプロセスが終了するのを待ちます。しかし、手動で殺さない限り、それは決して終わりません。

4

3 に答える 3

2

WaitForSingleObjectGetExitCodeProcessプロセスハンドルへのポインタではなく、プロセスハンドル自体を期待します。アンパサンドを削除します。

また、戻り値を確認し、GetLastError失敗した場合は呼び出します。それはあなたが将来の問題を診断するのに役立ちます。API関数が常に成功するとは限りません。

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

于 2008-11-25T18:04:14.437 に答える
0

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

これがデバッグに役立つかどうかにかかわらず、通常は「a-ha!」環境変数、パス、現在のディレクトリなどは、おそらくサービス内で期待するものではないことに気付くからです。アクセス許可は、この種の問題の最も一般的な理由ではありません。起動しようとしている外部アプリケーションに関する詳細を提供していただけますか。おそらく、これを理解するのに役立ちます。

于 2008-11-25T18:29:47.490 に答える
0

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

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

于 2008-11-25T18:30:08.597 に答える