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&Aを見た人が検索しているワード

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

Q美容室の広告に載っている「ワンプロセス」の意味。

髪を切ろうと思い、ホットペッパーで美容室を
探していました。

カラーとか、パーマのとこに「ワンプロセスのみ」
という表示がされていることがありますが、
これはどのような意味なのでしょうか?

ご存知の方、教えてください。よろしくお願いします。

Aベストアンサー

ワンプロセスと言うのは、1回だけと言うことです。

たとえばカラーなら、1度薬液を付けるだけとかです。
カラーの場合は、新生毛とカラーの毛(既成毛)とでは色合いが違いますので、同じ薬液を塗れませんので2プロセス以上の施術になりますね。

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

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

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

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

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

<環境>
WindowsXP
VC++6.0

Aベストアンサー

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

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

Qプロセス監視とサービス監視

下記の質問にてプロセスとサービスの違いについて少し理解ができました。
http://oshiete.goo.ne.jp/qa/7395829.html

しかし、私の理解が正しいとするとプロセスはサービスよりも詳細な単位になるためプロセス監視を行えばサービス監視は行えているということになります。

そこで二点質問がございます。
1.上記の私の理解は正しいか
2.プロセス監視ではなく、サービス監視を行う具体的な意味は

ご教示いただけますと幸いです。

Aベストアンサー

・UNIX系のinetdやwindowsのsvchostなどプロセス名とサービスが単純に結びついていないサービスがあります。
・プロセスは起動しているが、ハングアップなどでサービスとして機能していない場合があります

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が取得できないからです。

...続きを読む

Q子プロセス、

親プロセスから子プロセスを生成するとは具体的に何を意味しているのでしょうか?
またresume文とはなんでしょうか?
何をしてくれているのでしょうか?
なぜUNIXは安定していると言われるのでしょうか?
聞いたけど忘れてしまいました、
お願いします。

Aベストアンサー

再レスです。
身近な例ですとエクセルとかで新規作成ボタンを押すと新しいシートが作られるじゃないですか。
いくつも作れてどれも同じ動作やインターフェースをしています。
それらのシートはボタンが押されるまで存在しなかったものです。
また、それらは独立しているので、どのシートに移動しても構いませんよね。
立派な子プロセスですよね。メモ帳なんかだと親プロセスが新たに開きますね。
この例ではユーザーの操作によるものですが、プログラムによっては内部でプロセスを作り並列的に動作するものもあります。

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ビジネスの場における「プロセス」とは?

初めまして、今現在大学生で、企業にてインターンをやっています。

上司や社員と会話、会議をする際に「プロセス(Process)」という言葉がよく使われるんですが、その言葉自体の概念、意味を理解できていないせいでまったくピンと(理解で)きません。

例えば、ある事、業務を上司に説明した際に、
「プロセスでものを考えないと伝えたいことが上手く伝わらない」、
「このプロジェクトに関してのプロセスを資料としてまとめて」など言われます。

ここで言う「プロセス」とはどういう事でしょうか?
質問が抽象的過ぎて、答えにくいかと思いますがお願いします。

Aベストアンサー

日本語としては「手順」・「流れ」でいいんですが、「プロセス」と
言った場合、言外に「何か全体としての"システム"が存在して、
その結果としての"手順"」という意味があります。

「システム」が中身で、それが外に出てきたものが「プロセス」と
いう感じですね。往々にしてこの2つの言葉はセットにして使われ
たりしますし・・・。

単に「手順」と受け取ると、言外にある「全体としての"システム"」
を見落としてしまう可能性がある、という点には注意して下さいね。

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

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

Aベストアンサー

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

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

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

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

Qillustrator 特色やグローバルプロセスカラーについて

illustrator初心者です。
スウォッチパレットというのがあって、グローバルプロセスカラーや特色などあるのですが、このグローバルプロセスカラーを特色に変換するということはどういう意味があるのですか?
また、色を登録するときにはどの色でも特色として登録することができるのでしょうか?
よろしくお願いします。

Aベストアンサー

>一般に使う場合にはillustratorのスウォッチオプションの特色をプロセスカラーに変換して使用したりすることにはどんな意味があるのですか?それとも、これはほとんど印刷所向けのための機能なのでしょうか?

こうした板で色に関する論議をする際は、RGBカラー系とCMYKカラー系を切り分けておかないとややこしくなります。
一般の人にはCMYKも特色も無縁の領域ですから、先にも言ったように「どうぞお好きなように」です。つまり家庭用や事務用プリンタのインクはお望みのインクに変えることはできないからです。同様にプロセスカラーというCMYKについても一般のパソコンユーザには無縁な領域であり、使いようのない色体系です。
このようにプロセスカラーとかillustratorのスォッチとして登録されているDICやパントンなどは、インキを変更できる商業印刷機だけの独特のカラー体系で、それをパソコン上で事前にシミュレートする機能としてあると受け止めてください。
ただしモニタのカラー体系はRGBですから、スオッチにある特色も印刷された時の色とはずれがあります。そこで実際に印刷されたカラーチップで確認しておかないと、結果確認にはなりません。

>DTPをマスターするには印刷会社などにアルバイトしたほうが早く覚えられるのでしょうか・・・。

将来商業印刷関連の職種を指向するなら、この世界の空気に触れておくことは有意義でしょう。ただし色の決定権はデザイナーやクライアントにあるので、印刷所のオペレーターが自己決定するケースはそうザラにあるわけではありません。その辺も考慮の内に入れておいてください。
もしDTPとCMYKカラー体系について勉強したいのであれば、
↓『DTP&印刷スーパーしくみ事典』がお薦めです。

http://www.jagat.or.jp/books/Catalog/itaku.htm

参考URL:http://www.jagat.or.jp/books/Catalog/itaku.htm

>一般に使う場合にはillustratorのスウォッチオプションの特色をプロセスカラーに変換して使用したりすることにはどんな意味があるのですか?それとも、これはほとんど印刷所向けのための機能なのでしょうか?

こうした板で色に関する論議をする際は、RGBカラー系とCMYKカラー系を切り分けておかないとややこしくなります。
一般の人にはCMYKも特色も無縁の領域ですから、先にも言ったように「どうぞお好きなように」です。つまり家庭用や事務用プリンタのインクはお望みのインクに変えることはできないからで...続きを読む

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を見た人がよく見るQ&A

人気Q&Aランキング