重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

いつもお世話になってます。

プロセスに関することで分からないことがあるため、どなたか御教授して下さい。

只今、VC++で開発を行っているのですが、CreateProcess関数を使用して開始したプロセスの情報が、引数で指定したPROCESS_INFORMATIONにプライマリースレッドのハンドルやIDが設定されるのは知っているのですが、現在動作中のプロセスからそのプロセスのプライマリースレッドのIDを取得することは可能でしょうか?

具体的には、動作中のプロセスIDを指定するとそのプロセスのプライマリースレッドに対してPostThreadMessageで任意のメッセージが送れるという仕様です。

対象のプロセスがウィンドウを持っていれば、EnumWindows関数を使用してウィンドウに対してPostMessageができるというのは分かったのですが、今回対象のプロセスがウィンドウを持たない為、上記のようにスレッドに対してメッセージを送るようになっています。

CreateProcess呼び出し時にはスレッドIDが取得できることから、プロセスID、または、プロセスハンドルからスレッドIDが取得できるのではないかなと考えられるんですが。。。。

A 回答 (2件)

★アドバイス


・スレッド情報を列挙して一致するプロセスIDのスレッドIDを使えば良いと思います。
 列挙しないでプロセスID→スレッドIDの変換方法は私は知りません。あれば便利ですね。
 スレッドの列挙は Thread32First()、Thread32Next() 関数で行えます。
 詳しくは次のリンクをどうぞ。
 http://blog.goo.ne.jp/masaki_goo_2006/e/c80dd95f …
 列挙したら THREADENTRY32 構造体の th32OwnerProcessID メンバが検索したい
 プロセスIDと一致していれば同じ構造体の th32ThreadID メンバがスレッドIDです。
 これでプロセスIDからスレッドIDに変換できます。
・以前に直接プロセスID(プロセスハンドル)からスレッドIDに変換する方法を探した事が
 ありますが見つかりませんでした。見つかったのはいずれも上記の方法ばかりです。
・以上。参考に。

参考URL:http://blog.goo.ne.jp/masaki_goo_2006/e/c80dd95f …
    • good
    • 0
この回答へのお礼

ありがとうございました。Thread32First()、Thread32Next() を使用して無事解決することができました。

1点だけ確認したいのですが、同一プロセス内のスレッドのうち、列挙順の最初のスレッドそのプロセスのプライマリースレッドを示すと考えて良いのでしょうか?

何度かテストしたのですが、CreateProcessで取得できるスレッドIDと列挙順の最初のスレッドIDが同一であることが確認できました。
上記の仕様と解釈してしまってもよいのでしょうか?上記のような仕様じゃないと困ることがあるので。。。

お礼日時:2007/12/13 12:27

★アドバイス


>1点だけ確認したいのですが、同一プロセス内のスレッドのうち、
>列挙順の最初のスレッドそのプロセスのプライマリー・スレッドを示すと考えて良いのでしょうか?
 どうなんでしょう?
 私は列挙される最初の1つ目をプロセスのプライマリー・スレッドと考えていますが…。
 私も実際に GetWindowThreadProcessId() で返されたスレッドIDと列挙される最初の1つ目を
 チェックして一致したので多分最初の1つ目がプライマリー・スレッドのIDだと思います。
・同様な関数群にモジュール(Module32First、Module32Next)の列挙があります。
 こちらは MSDN サイトのどこかにしっかりと最初のモジュールがプロセス(exe)であると
 書いてありました。スレッドの方は MSDN の書かれているかどうか分かりません。
 でもプロセスは最低1つのスレッドを持ち、このスレッドはプロセスが終了するまで存在し、
 子供のスレッドはプライマリー・スレッドの次に作られるので列挙の順がスレッドが
 作成された順に列挙しているように思います。私の推測ですが…。
 それにプライマリー・スレッドは一度消滅してまた作られることもないでしょうから。
 という理由で最初に列挙される1つ目をプライマリー・スレッドと考えて良いような気がします。
・以上。この回答は参考意見として下さい。
    • good
    • 0
この回答へのお礼

ありがとうございました。
そこらへんをもう少し調査してみようと思います。
大変参考になりました。

お礼日時:2007/12/13 13:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!