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

ハンドルから元のIDを割り出す関数でもないですかね。

このQ&Aに関連する最新のQ&A

ASP 比較」に関するQ&A: [ASP]日付と時間の比較

A 回答 (3件)

こんにちは。

itohhといいます。

一発でプロセスハンドルからプロセスIDを取得することはムリだと思います。

代案ですが。
1.プロセスの列挙するAPIを使用してプロセスIDを取得する。
  WinNT系ならEnumProcess関数、Win9x系ならProcess32First関数
  以下のページを参考にしてください。
  URL:http://www.microsoft.com/japan/support/kb/articl …
2.取得したプロセスIDからプロセスハンドルを取得する。
  OpenProcess関数
3.対象のプロセスハンドルと取得したプロセスハンドルを比較する。
4.同一のプロセスハンドルが見つかるまで2と3を繰り返す。

こんな案では如何ですか?

参考URL:http://www.microsoft.com/japan/support/kb/articl …
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/03/15 02:12

なるほど、容易ではないですね。


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

参考URL:http://www.vbvbvb.com/jp/gtips/1101/gCreateToolh …
    • good
    • 0
この回答へのお礼

じつはやりたいことは、プロセスとスレッドの優先度を指定した、実行プログラムなのです。

そこで、プロセスの優先度は、CreateProcessでもShellExecuteExでもハンドルが得られればいいのですが、スレッドはCreateToolhelp32Snapshot+Thread32First/Nextで得られた結果のうち、ParentProcessIdが親のものと一致したスレッドだけ取り出して優先度を指定しているのです。
このスレッド列挙関数はあるプロセスの所有するスレッドだけを挙げてくれるのではないところが問題です。

なかなかの案ですが、確実性に欠けますね。
どうもありがとうございました。
また、何か浮かんだらよろしくおねがいします。

お礼日時:2002/03/14 23:19

GetWindowThreadProcessId



参考URL:http://www.vbvbvb.com/jp/gtips/0751/gGetWindowTh …
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/03/14 18:54

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

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

以下の方法を調べていますが、プロセスIDからウィンドウハンドルを取得する方法がわかりませんでした。

(1)自分がCreateProcessで生成したプロセスのウィンドウハンドル

(2)自分とは関係ないプロセスで、プロセスIDだけ判明しているプロセスのウィンドウハンドル

ご存知の方、ご教授願います。

<環境>
WindowsXP
VC++6.0

Aベストアンサー

(1)も(2)も一緒です。

1.EnumWindowsでトップレベルウィンドウを列挙
2.GetWindowThreadProcessIdでプロセスIDを取得
3.プロセスIDが同一だったらEnumChildWindowsで子ウィンドウを列挙

QShellExecuteExでハンドルの取得

ここで教えて頂きhpを見ながら
下記のようにしてみましたが
hProcessからハンドルが取れません
エクスプローラは立ち上がりますし
わざとエラーを起こさせても返ってきます
でもハンドルは取れません
宜しくお願いいたします

SHELLEXECUTEINFO shellexe;
HANDLE shellexehandle;


memset( &shellexe, 0, sizeof(SHELLEXECUTEINFO) );
shellexe.cbSize = sizeof(SHELLEXECUTEINFO);
shellexe.fMask = SEE_MASK_NOCLOSEPROCESS;
shellexe.hwnd = HWND_DESKTOP;
shellexe.lpVerb = "explore";
shellexe.lpFile = "C:\\";
shellexe.lpParameters = NULL;
shellexe.lpDirectory = NULL;
shellexe.nShow = SW_SHOWNORMAL;

ShellExecuteEx( &shellexe );

hShell = shellexe.hInstApp;
shellexehandle = shellexe.hProcess;

ここで教えて頂きhpを見ながら
下記のようにしてみましたが
hProcessからハンドルが取れません
エクスプローラは立ち上がりますし
わざとエラーを起こさせても返ってきます
でもハンドルは取れません
宜しくお願いいたします

SHELLEXECUTEINFO shellexe;
HANDLE shellexehandle;


memset( &shellexe, 0, sizeof(SHELLEXECUTEINFO) );
shellexe.cbSize = sizeof(SHELLEXECUTEINFO);
shellexe.fMask = SEE_MASK_NOCLOSEPROCESS;
shellexe.hwnd = HWND_DESKTOP;
shellexe.l...続きを読む

Aベストアンサー

>違うハンドルが返ってきてるのでしょうか?
>SetWindowPos(shellexehandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
>で立ち上げたアプリを最前面固定にしたいのですが

hProcessは、プロセスハンドルです。で、hInstAppはインスタンスハンドルです。SetWindowPosで使用するのはウィンドウハンドルで、すべて別物です。

で、ご希望の処理を実現するには実はShellExecuteExを
使うことは出来ません。理由は、起動したプロセスの
プロセスIDが取得できないからです。


で、どのようにすればいいかというと、
1.FindExecutableで、関連付けされているアプリケーションを取得
2.CreateProcessで起動(CreateProcessならプロセスIDを取得できる)
3.EnumWindowsでウィンドウを列挙
4.列挙したウィンドウから、GetWindowThreadProcessIdで
そのウィンドウを持っているプロセスのプロセスIDを取得
5.起動したアプリのプロセスIDと同じかどうかチェックし、
同じだったらそのウィンドウのウィンドウハンドルを
引数にしてSetWindowPosを呼び出す

てな事をする必要があります。

注意が必要なのは、プロセスが起動直後にウィンドウを表示していない可能性がある点と、1つのプロセスは、複数のトップレベルウィンドウを持つ可能性がある点です。

>違うハンドルが返ってきてるのでしょうか?
>SetWindowPos(shellexehandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
>で立ち上げたアプリを最前面固定にしたいのですが

hProcessは、プロセスハンドルです。で、hInstAppはインスタンスハンドルです。SetWindowPosで使用するのはウィンドウハンドルで、すべて別物です。

で、ご希望の処理を実現するには実はShellExecuteExを
使うことは出来ません。理由は、起動したプロセスの
プロセスIDが取得できないからです。

...続きを読む

Qpopenした子プロセスのプロセスIDを知る方法は?

タイトルのとおりです。
popen後のPIDを管理したいのですが
PIDを知る方法がわかりません。

どうしたらよいか教えてください。

Aベストアンサー

popenの仕様上、子プロセスのPIDを呼び出し元が知る方法は標準では用意されていません。

したがって、解決方法としては、ソースをコピーしてpopenのスーパーセットを用意するのが一番簡単です。

FreeBSDの/usr/src/libc/gen/popen.cの実装では、関数でstaticにポインタを確保していて、popenが呼び出されるたびにとpidとfpを保存するメモリの一次リンクが保持されています。

この場合、staticのポインタのリストの内容を取り出せる関数をひとつ実装するだけで、pidは取り出せます。
実装とはいっても、pcloseではwait4を実行するためにリストの内容をたぐるコードが入っているので、そこをコピペするだけです。

いかがでしょうか。

Qプロセスハンドル or ウインドウハンドル ??

こんにちは、E46-M3と申します。
さっそくですが、
あるプログラムから別のアプリケーションを起動させる際
または、終了させる際「ハンドル」を使用しますが、
ハンドルそのものの知識が浅いので
是非わかりやすく教えて頂ければ思います。
また、プロセスハンドルとウインドウハンドルの
違いについても教えて頂ければと思います。
よろしくお願い致します。

Aベストアンサー

 ハンドルについての解説は、それだけでかなりのスペースが必要です。ので、簡単に書きます。
 詳細は、WindowsAPIバイブル等の書籍を購入して読んで来下さい。

 プロセスハンドルは、各アプリケーション内部で発生したプロセスが持つハンドルです。親ハンドルは、アプリケーションのプロセスハンドルにもなります。
 ウィンドウハンドルは、各アプリケーションから作成される窓毎に持つハンドルです。メイン画面のハンドルは、アプリケーションのハンドルとなります。

 別のアプリケーションを起動する場合には、プロセスハンドルが取得できます。しかし、Windowsの終了等には、プロセスハンドルではなく、ウィンドウハンドルが必要になります(ヘルプ読んでね)。

 説明の都合上端折っている所があるので、正確に覚える場合には、書籍の購入を強くお薦めします。

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

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

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

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

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

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

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

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

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

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

具体的には、動作中のプロセスIDを指定するとそのプロセスのプライマリースレッ...続きを読む

Aベストアンサー

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

参考URL:http://blog.goo.ne.jp/masaki_goo_2006/e/c80dd95f96cbd7aef524625da54b0ed0

★アドバイス
・スレッド情報を列挙して一致するプロセスIDのスレッドIDを使えば良いと思います。
 列挙しないでプロセスID→スレッドIDの変換方法は私は知りません。あれば便利ですね。
 スレッドの列挙は Thread32First()、Thread32Next() 関数で行えます。
 詳しくは次のリンクをどうぞ。
 http://blog.goo.ne.jp/masaki_goo_2006/e/c80dd95f96cbd7aef524625da54b0ed0
 列挙したら THREADENTRY32 構造体の th32OwnerProcessID メンバが検索したい
 プロセスIDと一致していれば同じ構造体の th32Thre...続きを読む


人気Q&Aランキング

おすすめ情報