プロセスIDを取得するには?

解決


りん  2006-02-22 03:33:38  No: 60797

プロセス名からプロセスIDを取得する方法を探しています。
以下のサンプルではうまくいかない場合もあったため、他のやり方を探して
います。
また、プロセス自体はプロセスIDを取得するプログラムが起動を行うので
はなく、他のアプリから立ち上げられたプロセスのIDを取得したいと思っ
ております。
よろしくお願いします。

http://support.microsoft.com/default.aspx?scid=kb;ja;JP175030


DD.  2006-02-22 04:23:27  No: 60798

FindWindowEx() でプロセスIDを取得したいウィンドウ(プロセス)のハンドルを取得して、GetWindowThreadProcessId() でプロセスIDを取得しましたよ。


kure  2006-02-22 19:44:54  No: 60799

> FindWindowEx() で

FindWindowやEnumWindowsではWindowを持たない
プロセスからプロセスIDを取得できません。
ウィンドウを持たないプロセスは除外する仕様であれば
FindWindowやEnumWindows->GetWindowTHreadProcessIdでできると思います。

> 以下のサンプルではうまくいかない場合もあったため

何がどううまくいってないのかわかりませんが、
プロセス自体の列挙ができているのであればあとは
プロセス名としてみているデータが正しいか、比較の方法が正しいか、
アクセス権限があるかといったところを疑ってみるべきでしょう。

上記方法およびPSAPI以外でのプロセスの列挙ができるのかは
識者の登場を待ちましょう(ぉ


りん  2006-02-22 22:09:07  No: 60800

ご回答ありがとうございました。

>何がどううまくいってないのかわかりませんが、

サンプルプログラム内のどっかでアプリが落ちてしまっていることはわかって
いるのですが、どこで落ちているのかはまだ特定できていない状況です。
Win2000Pro環境(開発環境)、WinXP環境(開発環境)では処理がうまくいく
のですが、実際の本番環境(Win2000Server)ではアプリが途中で落ちてしま
い、本番環境のため、簡単にデバッグ等の仕込み調査等ができない状況で、
どのステップで落ちているのかは特定できていません。

行いたいのはプロセス名(既にわかっている)からプロセスIDを引っ張って
、そのプロセスを強制終了させたかったので、上記のようなOS依存のDLL
を使用するものよりもっと簡単なやり方でプロセス終了させれば、と思い、
投稿しました。


kure  2006-02-23 00:14:27  No: 60801

> そのプロセスを強制終了させたかったので

強制終了ってもしかしてTerminateProcessとかですか!?

> 他のアプリから立ち上げられたプロセス

なんですよね!?

そんな危険なことをやるような設計が
まず間違ってます。

で本題のほうですが、

> サンプルプログラム内のどっかでアプリが落ちてしまっている

のであればサンプルプログラムなんだから
デバッグ版のバイナリを仕込んでWinDbgでデバッグとか
いろいろ手はあると思うのですがいかがでしょうか?
あとはコードレビューをしてもらうとか。

> 上記のようなOS依存のDLLを使用するものより

*「OS依存のDLL≒OSのバージョンによって使用するDLLが変わる」と解釈しました。

動作環境が完全に限定されているのであればサンプルのように
DynamicLinkしなくてもStaticLinkでも良い可能性があるはずです。
(仕様としてこのバージョンのWindows限定とかって書く必要はある)
更にVDM系のものは16bitプロセスを対象としないのであれば
必要ないものです。

リンク先にも

> すべての Win32 オペレーティング システムとのバイナリ互換を実現するために使用されます。 

と明記されています。
DynamicLinkする必要が必ずしもあるとは限らないということです。


りん  2006-02-23 04:20:43  No: 60802

>強制終了ってもしかしてTerminateProcessとかですか!?
  
そうです。しかし、2重、3重の落とし方をしてどうしても落ちなかった時
に使用するものです。TerminateProcessを使わない方が良いらしいですね。

>のであればサンプルプログラムなんだから
>デバッグ版のバイナリを仕込んでWinDbgでデバッグとか
>いろいろ手はあると思うのですがいかがでしょうか?
>あとはコードレビューをしてもらうとか。

”サンプルプログラム”とはMicrosoftで提示しているプログラムのことで
気楽に何度も本番環境には持って調査するわけにはいかないのでやり方を
変える方向で考えています。コードレビューは確かに可能ですね。

>リンク先にも
> すべての Win32 オペレーティング システムとのバイナリ互換を実現するために使用されます。 

情報ありがとうございました。

問題は解決し、今回教えて頂いたやり方でうまくプロセスIDが取れましたの
で、それでいこうと思います。ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加