実行中のプロセスを列挙 <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