• 締切済み

ShellExecuteが起動したプロセスのID

CreateProcessは起動したプロセスのIDをくれますが、ShellExecuteでは分からないものでしょうか。 ShellExecuteExならプロセスのハンドルを受け取ることはできますが、IDは分かりません。 ハンドルから元のIDを割り出す関数でもないですかね。

みんなの回答

  • itohh
  • ベストアンサー率45% (210/459)
回答No.3

こんにちは。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を繰り返す。 こんな案では如何ですか?

参考URL:
http://www.microsoft.com/japan/support/kb/articles/JP175/0/30.asp
haporun
質問者

お礼

あれ? ハンドルって同じプロセスに対していくらでも開けるから、新にOpenProcessしたら一生見つからないような・・・。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

なるほど、容易ではないですね。 CreateToolhelp32Snapshotで現在実行中のプロセスのプロセスIDと実行ファイルのフルパス名を 列挙できます。 つまり、EXE名からプロセスIDが分かります。 しかし、同じEXEを複数起動した場合はプロセスIDが複数あるので区別できない。 ShellExecuteを実行する前後のCreateToolhelp32Snapshotを比較する... うーんイマイチな案でした。

参考URL:
http://www.vbvbvb.com/jp/gtips/1101/gCreateToolhelp32SnapshotTh32csSnapmodule.html
haporun
質問者

お礼

じつはやりたいことは、プロセスとスレッドの優先度を指定した、実行プログラムなのです。 そこで、プロセスの優先度は、CreateProcessでもShellExecuteExでもハンドルが得られればいいのですが、スレッドはCreateToolhelp32Snapshot+Thread32First/Nextで得られた結果のうち、ParentProcessIdが親のものと一致したスレッドだけ取り出して優先度を指定しているのです。 このスレッド列挙関数はあるプロセスの所有するスレッドだけを挙げてくれるのではないところが問題です。 なかなかの案ですが、確実性に欠けますね。 どうもありがとうございました。 また、何か浮かんだらよろしくおねがいします。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

GetWindowThreadProcessId

参考URL:
http://www.vbvbvb.com/jp/gtips/0751/gGetWindowThreadProcessId.html
haporun
質問者

お礼

ウィンドウのないアプリケーションを想定していないし、そもそも、ウィンドウハンドルを得る手段もありません。

関連するQ&A