タイトル 現在起動しているプロセス情報を列挙する
対象言語 VB4.0, Access95以降
動作確認OS Windows95,98
使用関数 CreateToolhelp32Snapshot
Process32First Process32Next
改築日 1999/09/04
Source Download

全プロセスを列挙し、プロセス情報を表示します。


プロセスは刻一刻と変化するので、CreateToolhelp32Snapshot API関数
で、一旦その時点での全プロセス情報のスナップを撮ります。
そのスナップに対して、Process32First,Process32Next API関数
を使ってプロセス情報を取得していきます。
ですので、これらの関数でプロセス情報を取得しても、
その時点でプロセスが必ず存在するとは限らないので、注意して下さい。


この関数は現在、NTには対応していません。


1. フォームを作成しコマンドボタン(Command1)、リストボックス(List1) を貼り付けてください。

Option Explicit

Private Sub Command1_Click()

  Dim cnt As Integer
  Dim i As Integer

  cnt = Y_EnumProcessFromSnapshot()

  List1.Clear
  For i = 0 To cnt - 1
    With ProcessEntries(i)
      List1.AddItem "------- " & i + 1 & " -------"
      List1.AddItem "実行ファイル = " & EditBuf(.szExeFile)
      List1.AddItem "自プロセスID = " & Hex$(.th32ProcessID)
      List1.AddItem "親プロセスID = " & Hex$(.th32ParentProcessID)
      List1.AddItem "スレッド数  = " & .cntThreads
      List1.AddItem "優先度    = " & .pcPriClassBase
      List1.AddItem "参照回数   = " & .cntUsage
    End With
  Next

End Sub


Private Sub Form_Load()

  Call Command1_Click

End Sub



2.モジュールウインドウを作成し、下のソースを入力してください。


Option Explicit

'現在のプロセス情報のスナップショットを撮る
Declare Function CreateToolhelp32Snapshot Lib "kernel32" _
(ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long

'スナップショットから最初のプロセス情報を取得する
Declare Function Process32First Lib "Kernel32.dll" _
(ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long

'スナップショットから次のプロセス情報を取得する
Declare Function Process32Next Lib "kernel32" _
(ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long

Public Const MAX_PATH = 260

Type PROCESSENTRY32
  dwSize As Long 'この構造体のサイズ
  cntUsage As Long 'このプロセスが参照された回数
  th32ProcessID As Long 'プロセスID
  th32DefaultHeapID As Long 'デフォルトヒープID
  th32ModuleID As Long 'モジュールID
  cntThreads As Long 'スレッド数
  th32ParentProcessID As Long '親プロセスID
  pcPriClassBase As Long 'このプロセスのプライオリティ
  dwFlags As Long '未使用
  szExeFile As String * MAX_PATH 'プロセスのファイル名
End Type

Public Const TH32CS_SNAPPROCESS = &H2& 'プロセスのスナップを撮る

Public ProcessEntries() As PROCESSENTRY32 'この配列にプロセス情報がセットされる


Public Function Y_EnumProcessFromSnapshot() As Integer
'***************************************************************
'機能 : 起動しているプロセス情報を列挙する
'戻り値: プロセス数
'備考 : NTには対応していません。
'    プロセスは刻一刻と変化します。
'    ここで取得したプロセス情報は必ずしも存在するとは限りません。
'***************************************************************

  Dim longret As Long
  Dim hSnapShot As Long
  Dim Pentry As PROCESSENTRY32
  Dim ExePath As String
  Dim cnt As Integer

  ReDim ProcessEntries(0)

'現在のプロセス情報のスナップを撮る
  hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)

  If hSnapShot <> -1 Then

'スナップからプロセス情報を列挙し ProcessEntries配列にセット
    Pentry.dwSize = LenB(Pentry)
    longret = Process32First(hSnapShot, Pentry)
    cnt = 0
    Do While longret <> 0
      ReDim Preserve ProcessEntries(cnt)
      ProcessEntries(cnt) = Pentry
      cnt = cnt + 1
      longret = Process32Next(hSnapShot, Pentry)
    Loop
  End If

Y_EnumProcessFromSnapshot = cnt

End Function


Public Function EditBuf(Buf As String) As String
'***********************************************************
'機能 : 引数 Bufの文字列中の Nullコードを検索し、Nullコードを
'    除いた文字列を返す
'引数 : Buf = Nullコードを含む文字列
'戻り値: Nullコードを除いた文字列
'***********************************************************

  Dim i As Long

  i = InStr(Buf, vbNullChar)
  If i <> 0 Then
    EditBuf = Left$(Buf, i - 1)
  Else
    EditBuf = Buf
  End If

End Function





Copyright (C)1997-2001 空耳工房 MY2Project All rights reserved.