
いつもお世話になってます。
プロセスに関することで分からないことがあるため、どなたか御教授して下さい。
只今、VC++で開発を行っているのですが、CreateProcess関数を使用して開始したプロセスの情報が、引数で指定したPROCESS_INFORMATIONにプライマリースレッドのハンドルやIDが設定されるのは知っているのですが、現在動作中のプロセスからそのプロセスのプライマリースレッドのIDを取得することは可能でしょうか?
具体的には、動作中のプロセスIDを指定するとそのプロセスのプライマリースレッドに対してPostThreadMessageで任意のメッセージが送れるという仕様です。
対象のプロセスがウィンドウを持っていれば、EnumWindows関数を使用してウィンドウに対してPostMessageができるというのは分かったのですが、今回対象のプロセスがウィンドウを持たない為、上記のようにスレッドに対してメッセージを送るようになっています。
CreateProcess呼び出し時にはスレッドIDが取得できることから、プロセスID、または、プロセスハンドルからスレッドIDが取得できるのではないかなと考えられるんですが。。。。
No.1ベストアンサー
- 回答日時:
★アドバイス
・スレッド情報を列挙して一致するプロセス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 …
ありがとうございました。Thread32First()、Thread32Next() を使用して無事解決することができました。
1点だけ確認したいのですが、同一プロセス内のスレッドのうち、列挙順の最初のスレッドそのプロセスのプライマリースレッドを示すと考えて良いのでしょうか?
何度かテストしたのですが、CreateProcessで取得できるスレッドIDと列挙順の最初のスレッドIDが同一であることが確認できました。
上記の仕様と解釈してしまってもよいのでしょうか?上記のような仕様じゃないと困ることがあるので。。。
No.2
- 回答日時:
★アドバイス
>1点だけ確認したいのですが、同一プロセス内のスレッドのうち、
>列挙順の最初のスレッドそのプロセスのプライマリー・スレッドを示すと考えて良いのでしょうか?
どうなんでしょう?
私は列挙される最初の1つ目をプロセスのプライマリー・スレッドと考えていますが…。
私も実際に GetWindowThreadProcessId() で返されたスレッドIDと列挙される最初の1つ目を
チェックして一致したので多分最初の1つ目がプライマリー・スレッドのIDだと思います。
・同様な関数群にモジュール(Module32First、Module32Next)の列挙があります。
こちらは MSDN サイトのどこかにしっかりと最初のモジュールがプロセス(exe)であると
書いてありました。スレッドの方は MSDN の書かれているかどうか分かりません。
でもプロセスは最低1つのスレッドを持ち、このスレッドはプロセスが終了するまで存在し、
子供のスレッドはプライマリー・スレッドの次に作られるので列挙の順がスレッドが
作成された順に列挙しているように思います。私の推測ですが…。
それにプライマリー・スレッドは一度消滅してまた作られることもないでしょうから。
という理由で最初に列挙される1つ目をプライマリー・スレッドと考えて良いような気がします。
・以上。この回答は参考意見として下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プロセスIDの取得方法について
-
vb.netでEXCEL起動がうまくでき...
-
アプリケーションが終了するま...
-
C++のプログラムをバックグラウ...
-
タスクマネージャーのプロセス...
-
AppActivate関数について
-
他のEXEが起動しているかの確認
-
Process.Startの戻り値を後で取得
-
forkについて
-
他のアプリケーションの起動と...
-
C言語 特定のプロセスの終了を...
-
実行中のプログラムIDが取得...
-
Linuxのchdir(カレントディレク...
-
C#でのbatファイル実行結果取得
-
非表示になったエクセルは?
-
Linuxでのスレッド間メッセージ...
-
WMIでのプロセスの起動・終了監...
-
UNIX関数?(popen)...
-
windowsのプロセスIDやスレッド...
-
〔Windowsタスクマネージャ〕メ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
タスクマネージャーのプロセス...
-
バックグラウンドのプロセスの...
-
プロセスのアタッチ・デタッチ...
-
OSPFでプロセスを分ける意義に...
-
ADOでアクセスのレコードに...
-
非表示になったエクセルは?
-
Process.Startの戻り値を後で取得
-
vb.netでEXCEL起動がうまくでき...
-
C#でのbatファイル実行結果取得
-
プロセスIDの取得方法について
-
Linuxでのスレッド間メッセージ...
-
Visual C++からpingを実行して...
-
SendMessageが失敗するときがある
-
IISがフリーズ
-
スティーブ・ジョブズはプログ...
-
c言語でプロセスIDを調べたい
-
特定ユーザーのプロセス情報を...
-
怪しいプロセス教えてください。
-
セマフォとmutexの違いは?
-
Windowsでのfork方法
おすすめ情報