- 締切済み
ShellExecuteが起動したプロセスのID
CreateProcessは起動したプロセスのIDをくれますが、ShellExecuteでは分からないものでしょうか。 ShellExecuteExならプロセスのハンドルを受け取ることはできますが、IDは分かりません。 ハンドルから元のIDを割り出す関数でもないですかね。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- itohh
- ベストアンサー率45% (210/459)
こんにちは。itohhといいます。 一発でプロセスハンドルからプロセスIDを取得することはムリだと思います。 代案ですが。 1.プロセスの列挙するAPIを使用してプロセスIDを取得する。 WinNT系ならEnumProcess関数、Win9x系ならProcess32First関数 以下のページを参考にしてください。 URL:http://www.microsoft.com/japan/support/kb/articles/JP175/0/30.asp 2.取得したプロセスIDからプロセスハンドルを取得する。 OpenProcess関数 3.対象のプロセスハンドルと取得したプロセスハンドルを比較する。 4.同一のプロセスハンドルが見つかるまで2と3を繰り返す。 こんな案では如何ですか?
- todo36
- ベストアンサー率58% (728/1234)
なるほど、容易ではないですね。 CreateToolhelp32Snapshotで現在実行中のプロセスのプロセスIDと実行ファイルのフルパス名を 列挙できます。 つまり、EXE名からプロセスIDが分かります。 しかし、同じEXEを複数起動した場合はプロセスIDが複数あるので区別できない。 ShellExecuteを実行する前後のCreateToolhelp32Snapshotを比較する... うーんイマイチな案でした。
お礼
じつはやりたいことは、プロセスとスレッドの優先度を指定した、実行プログラムなのです。 そこで、プロセスの優先度は、CreateProcessでもShellExecuteExでもハンドルが得られればいいのですが、スレッドはCreateToolhelp32Snapshot+Thread32First/Nextで得られた結果のうち、ParentProcessIdが親のものと一致したスレッドだけ取り出して優先度を指定しているのです。 このスレッド列挙関数はあるプロセスの所有するスレッドだけを挙げてくれるのではないところが問題です。 なかなかの案ですが、確実性に欠けますね。 どうもありがとうございました。 また、何か浮かんだらよろしくおねがいします。
- todo36
- ベストアンサー率58% (728/1234)
GetWindowThreadProcessId
お礼
ウィンドウのないアプリケーションを想定していないし、そもそも、ウィンドウハンドルを得る手段もありません。
お礼
あれ? ハンドルって同じプロセスに対していくらでも開けるから、新にOpenProcessしたら一生見つからないような・・・。