在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、函数介绍 在Windows系统中动态链接库kernel32.dll提供了获取和处理系统进程的许多接口函数,Delphi语言把这些函数接口封装到Tlhelp32.pas中,供Delphi用户开发过程调用。要详细了解相关知识可以查阅Tlhelp32.pas原文件和Windows SDK提供的帮助文件。其中同本文涉及的接口函数主要有CreateToolhelp32Snapshot、process32first、 process32next、module32first、module32next五个函数以及TMODULEENTRY32、 TPROCESSENTRY32两个数据结构。
该函数是要实现上述目的最核心的一个函数,它可以获取系统运行进程(Process)列表、线程(Thread)列表和指定运行进程的堆 (Heap)列表、调用模块(Module)列表。
TH32CS_SNAPHEAPLIST:所创建的Snapshot包含堆列表 TH32CS_SNAPMODULE :所创建的Snapshot包含调用模块列表 TH32CS_SNAPTHREAD :所创建的Snapshot包含线程列表; TH32CS_SNAPPROCESS :所创建的Snapshot包含进程列表; TH32CS_SNAPALL :所创建的Snapshot包含上述所有列表; th32ProcessID参数:
这四个函数都是对"Snapshot"所包含的列表进行息获取,根据函数字面的英文意义,不难理解各函数的含义和区别,四个函数的格式分别为:
BOOL WINAPI Process32Next(HANDLE hSnapshot, BOOL WINAPI Module32First(HANDLE hSnapshot, BOOL WINAPI Module32Next(HANDLE hSnapshot,
typedef struct tagPROCESSENTRY32 { DWORD dwSize; DWORD cntUsage; DWORD th32ProcessID; //进程句柄 DWORD th32DefaultHeapID; DWORD th32ModuleID; DWORD cntThreads; DWORD th32ParentProcessID; LONG pcPriClassBase; DWORD dwFlags; char szExeFile[MAX_PATH]; } PROCESSENTRY32; typedef struct tagMODULEENTRY32 { DWORD dwSize; DWORD th32ModuleID; DWORD th32ProcessID; DWORD GlblcntUsage; DWORD ProccntUsage; BYTE * modBaseAddr; DWORD modBaseSize; HMODULE hModule; char szModule[MAX_MODULE_NAME32 + 1]; char szExePath[MAX_PATH]; //调用模块的含路径文件名 } MODULEENTRY32;
ProcessList:= CreateToolhelp32Snapshot
Process32First(ProcessList,pe) Process32Next(ProcessList,pe)
ModuleRec:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe.processID);
Module32First(ModuleList,pm); Module32Next(ModuleList,pm);
program Project1; {$APPTYPE CONSOLE} uses SysUtils,Messages,Windows,Tlhelp32; var processRec: Thandle; pe32: TProcessEntry32; processNum: Integer; procedure EnumModule(processid: DWORD); var moduleRec: THandle; pm: TModuleEntry32; begin // create module snapshot moduleRec := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,processID); //module size pm.dwSize := sizeof(TModuleEntry32); // first module? if ( module32First(moduleRec,pm) ) then begin while Module32Next(moduleRec,pm) do begin Writeln('module name: ',StrPas(pm.szModule)); end; end; CloseHandle(moduleRec); end; procedure OutProcessName(processName: string); begin WriteLn('Process Name:',processName); end; begin processNum := 0; //create process snapshot processRec := CreateToolHelp32Snapshot( TH32CS_SNAPPROCESS,0 ); pe32.dwSize := sizeOf( TPROCESSENTRY32 ); if Process32First( processRec, pe32) then begin // enum the process module OutProcessName( pe32.szExeFile ); EnumModule( pe32.th32ProcessID ); inc(processNum); //inc process count while Process32Next( processRec,pe32 ) do begin OutProcessName( pe32.szExeFile ); EnumModule( pe32.th32ProcessID ); inc(processNum);//inc process count end; WriteLn('Total System Process:',processNum); CloseHandle(processRec); Readln; end; end.
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论