• 締切済み

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

  • windowsのプロセスIDやスレッドIDの使い道

    win32APIで取得したプロセスIDやスレッドIDの使い道について教えてください。 CreateProcessなどで取得したプロセスのハンドルやスレッドのハンドルはwin32APIで使う場面がありますが、プロセスIDやスレッドIDの使い道がわかりません。 どのような場面でプロセスIDやスレッドIDを使うのでしょうか?具体的にこんな事をするときに使うよなどあれば教えていただきたいです。 プロセスIDやスレッドIDを引数にとるAPI関数などがあれば教えていただきたいです。

  • 既存プロセスからプロセスのプライマリースレッドIDの取得方法

    いつもお世話になってます。 プロセスに関することで分からないことがあるため、どなたか御教授して下さい。 只今、VC++で開発を行っているのですが、CreateProcess関数を使用して開始したプロセスの情報が、引数で指定したPROCESS_INFORMATIONにプライマリースレッドのハンドルやIDが設定されるのは知っているのですが、現在動作中のプロセスからそのプロセスのプライマリースレッドのIDを取得することは可能でしょうか? 具体的には、動作中のプロセスIDを指定するとそのプロセスのプライマリースレッドに対してPostThreadMessageで任意のメッセージが送れるという仕様です。 対象のプロセスがウィンドウを持っていれば、EnumWindows関数を使用してウィンドウに対してPostMessageができるというのは分かったのですが、今回対象のプロセスがウィンドウを持たない為、上記のようにスレッドに対してメッセージを送るようになっています。 CreateProcess呼び出し時にはスレッドIDが取得できることから、プロセスID、または、プロセスハンドルからスレッドIDが取得できるのではないかなと考えられるんですが。。。。

  • プロセスIDからウィンドウハンドルを取得する方法

    以下の方法を調べていますが、プロセスIDからウィンドウハンドルを取得する方法がわかりませんでした。 (1)自分がCreateProcessで生成したプロセスのウィンドウハンドル (2)自分とは関係ないプロセスで、プロセスIDだけ判明しているプロセスのウィンドウハンドル ご存知の方、ご教授願います。 <環境> WindowsXP VC++6.0

  • 子プロセスのデバッグ方法について

    VisualStudio2008のVCでデバッグをしています。 Win32のCreateProcess関数で"自分自身"のEXEファイルを実行すると、新プロセスが起動するのですがデバッグができません。 CreateProcessの呼び出し側プロセスと、同じプログラムである新プロセスを同時にデバッグすることはできないものでしょうか。

  • VB.netでShellExecuteがしたい

    VB6ですと ShellExecute(Me.Handle, "open", "History.csv", "", "", 3) とするとエクセルが開いて「History.csv」が観覧できるのですが、VB.netだと、エラーがでないもののエクセル画面がでてきません。なぜでしょうか? また、ShellExecuteに変わるような関数がありますでしょうか? 以下はソースです、パスは間違っていないし、返り値は562954248388610となっています。 i = ShellExecute(Me.Handle.ToInt64, "open", sFolderPullPath & "SerialHistory.csv", "", "", 3)

  • ShellExecuteでエクセルファイルが起動しません。

     今、API関数GetOpenFileNameで「ファイルを開く」コモンダイアログを出して、  そこから選んだファイルのフルパスをテキストボックスに入れています。  さらにそのテキストボックスの中に入ったフルパスをAPI関数ShellExecuteで起動  させようとしているのですが、起動してくれません。  ちゃんとフルパスは入っています。  試しに新しいフォームを作ってShellExecute単独で、直接フルパスを  指定してやってみたところ起動できました。  問題は、パスではなく他の引数でしょうか??  ちなみに第1引数   : me.hwnd      第2引数   : "open"      第3引数   : フルパス      第4・5引数 : vbNullString      第6引数   : SW_SHOW と指定しました。  第4と5の引数はvbNullCharや""と指定してみました。  よろしくお願いします。

  • 起動しているアプリケーションのプロセスIDを取得したい.

    現在,起動しているアプリケーションのプロセスIDを取得したいと考えています. プロセスIDを取得するコマンドはあるのでしょうか? 環境:Windows2000+SP3

  • プロセスIDの取得(タスクバーのみ)

    似たような質問ですがわからないことがあるので質問します。 Enumwindows関数でタスクバーにあるウインドウ(トップレベルウィンドウ)を列挙することはできましたが、そのプロセスIDを表示させることができませんでした。 別のプログラムでプロセスIDを表示させることはできましたが そのプログラムですとすべてのプロセスを表示することになるので これでは自分のやりたい事と少し違うので困っています。 どうしたらタスクバーにあるプロセスIDをとりだすことができるので しょうか? 自分では GetWindowThreadProcessId関数 EnumChildWindows関数 を使用すればいいと思ってますが、具体的なプログラムが くめていません。 どうかよろしくおねがいします。

  • c言語でプロセスIDを調べたい

    unixのコマンドで ps aux と打つと "ユーザー名" "プロセスID"  。 。 。 。 がでますけど、この2番目の"プロセスID"を調べる関数ってありますか? ※というのも、プロセスID(ジョブ番号)を引数にして、そのプロセスが終了したら何か処理をさせるというプログラムを作りたいからです。よろしくお願いします。

  • ShellExecuteでハンドルを取得

    ShellExecuteで立ち上げたアプリケーションの ハンドルを取得取得できるのでしょうか? 返値はエラーなどでしたよね? はじめのShellExecute(ここ ,.....)の部分で いいのでしょうか? 宜しくお願いいたします。

専門家に質問してみよう