実行中のプロセスを列挙         <TOP>


実行中のプロセス一覧を列挙します。Windows9xとWindowsNT系ではアプローチが異なるため分けて実行します。

http://support.microsoft.com/default.aspx?scid=kb;ja;JP187913をF-BASIC用に書き換えています。

Process32First 最初のプロセスに関する情報を取得

Process32Next 2番目以降のプロセスに関する情報を取得

CloseHandle オープンされているオブジェクトハンドルをクローズ

OpenProcess 既存のプロセスオブジェクトのハンドルを取得

EnumProcesses プロセスの列挙

GetModuleFileNameEx ロードされている実行モジュールのフルパス名を取得

EnumProcessModules 指定されたプロセス内の各モジュールのハンドルを取得 (WindowsNT/Windows2000以降)

CreateToolhelp32Snapshot プロセスのスナップショットを取得

GetVersionEx オペレーティングシステムの種類やバージョンに関する情報を取得

 

 

'================================================================
'= 実行中のプロセス一覧を列挙
'= Windows9xとWindowsNT系ではアプローチが異なるため分けて実行
'=    (OpenProcess.bas)
'================================================================
#include "Windows.bi"

Type PROCESSENTRY32
    dwSize            As Long
    cntUsage          As Long
    th32ProcessID     As Long
    th32DefaultHeapID As Long
    th32ModuleID      As Long
    cntThreads        As Long
    th32ParentProcessID As Long
    pcPriClassBase    As Long
    dwFlags           As Long
    szExeFile         As String * 260
End Type

Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber  As Long
    dwPlatformId   As Long       '1 = Windows 95・2 = Windows NT
    szCSDVersion   As String * 128
End Type

' 最初のプロセスに関する情報を取得する関数
Declare Function Api_Process32First& Lib "Kernel32" Alias "Process32First" (ByVal hSnapshot&, lppe As PROCESSENTRY32)

' 2番目以降のプロセスに関する情報を取得する関数
Declare Function Api_Process32Next& Lib "Kernel32" Alias "Process32Next" (ByVal hSnapshot&, lppe As PROCESSENTRY32)

' オープンされているオブジェクトハンドルをクローズ
Declare Function Api_CloseHandle& Lib "Kernel32" Alias "CloseHandle" (ByVal hObject&)

' 既存のプロセスオブジェクトのハンドルを取得
Declare Function Api_OpenProcess& Lib "kernel32" Alias "OpenProcess" (ByVal dwDesiredAccess&, ByVal bInheritHandle&, ByVal dwProcessID&)

' プロセスの列挙
Declare Function Api_EnumProcesses& Lib "psapi" Alias "EnumProcesses" (ByRef lpidProcess&, ByVal cb&, ByRef cbNeeded&)

' ロードされている実行モジュールのフルパス名を取得
Declare Function Api_GetModuleFileNameEx& Lib "psapi" Alias "GetModuleFileNameExA" (ByVal Process&, ByVal hModule&, ByVal lpFilename$, ByVal nSize&)

' 指定されたプロセス内の各モジュールのハンドルを取得(Windows NT/2000以降)
Declare Function Api_EnumProcessModules& Lib "psapi" Alias "EnumProcessModules" (ByVal Process&, ByRef lphModule&, ByVal cb&, ByRef lpcbNeeded&)

' プロセスのスナップショットを取得
Declare Function Api_CreateToolhelp32Snapshot& Lib "Kernel32" Alias "CreateToolhelp32Snapshot" (ByVal dwFlag&, ByVal th32ProcessID&)

' オペレーティングシステムの種類やバージョンに関する情報を取得
Declare Function Api_GetVersionEx& Lib "Kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO)

#define PROCESS_QUERY_INFORMATION &H400 '取得したハンドルをGetExitCodeProcess関数、及びGetPriorityClass関数で使用できるようにする
#define PROCESS_VM_READ &H10            '取得したハンドルをReadProcessMemory関数で使用できるようにする
#define MAX_PATH 260
#define STANDARD_RIGHTS_REQUIRED &HF0000 '標準的な権利を要求することを示す定数
#define SYNCHRONIZE &H100000             'STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
#define PROCESS_ALL_ACCESS &H1F0FFF     'すべてのアクセス権を有効にする
#define TH32CS_SNAPPROCESS &H2          'プロセス一覧のスナップショット
#define hNull 0

Var Shared List1 As Object
Var Shared Button1 As Object

List1.Attach GetDlgItem("List1") : List1.SetFontSize 12
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Function StrZToStr(s As String) As String
Function StrZToStr(s As String) As String
    StrZToStr = Left$(s, Len(s) - 1)
End Function

'================================================================
'=
'================================================================
Declare Function getVersion()
Function getVersion()
    Var osinfo As OSVERSIONINFO
    Var Ret As Integer

    osinfo.dwOSVersionInfoSize = 148
    osinfo.szCSDVersion = Space$(128)
    Ret = Api_GetVersionEx(osinfo)
    getVersion = osinfo.dwPlatformId
End Function

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    List1.ResetContent

    Select Case getVersion()
        Case 1 'Windows 95/98
            Var f As Long
            Var sname As String
            Var hSnap As Long
            Var proc As PROCESSENTRY32

            hSnap = Api_CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
            If hSnap = hNull Then Exit Sub
            proc.dwSize = Len(proc)
            ' Iterate through the processes
            f = Api_Process32First(hSnap, proc)

            Do While f
                sname = StrZToStr(proc.szExeFile)
                List1.AddString sname
                f = Api_Process32Next(hSnap, proc)
            Loop

        Case 2 'Windows NT
            Var cb As Long
            Var cbNeeded As Long
            Var NumElements As Long
            Var cbNeeded2 As Long
            Var ProcessIDs(200) As Long
            Var NumElements2 As Long
            Var Modules(200) As Long
            Var ModuleName As String
            Var nSize As Long
            Var hProcess As Long
            Var i As Long
            Var Ret As Long

            'Get the array containing the process id's For each process object
            cb = 8
            cbNeeded = 96
            Do While cb <= cbNeeded
                cb = cb * 2
                Ret = Api_EnumProcesses(ProcessIDs(1), cb, cbNeeded)
            Loop
            NumElements = cbNeeded / 4

            For i = 1 To NumElements

                'Get a handle To the Process
                hProcess = Api_OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessIDs(i))

                'Got a Process handle
                If hProcess <> 0 Then

                    'Get an array of the module handles For the specified process
                    Ret = Api_EnumProcessModules(hProcess, Modules(1), 200, cbNeeded2)

                    'Get the ModuleFileName
                    If Ret <> 0 Then
                         ModuleName = Space$(MAX_PATH)
                         nSize = 500
                         Ret = Api_GetModuleFileNameEx(hProcess, Modules(1), ModuleName, nSize)
                         List1.AddString Left$(ModuleName, Ret)
                    End If
                End If

                Ret = Api_CloseHandle(hProcess)
            Next
    End Select
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End