From cdea7d698c355342456513001a5c84a41ecaadae Mon Sep 17 00:00:00 2001 From: Jacek Date: Sat, 22 Aug 2020 00:50:52 +0200 Subject: [PATCH] Win.Processes: +GetProcessModulesCount, small refact. --- Base/JPL.Win.Processes.pas | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/Base/JPL.Win.Processes.pas b/Base/JPL.Win.Processes.pas index 5c397e3..ec7a20e 100644 --- a/Base/JPL.Win.Processes.pas +++ b/Base/JPL.Win.Processes.pas @@ -11,10 +11,11 @@ interface Windows, SysUtils, Classes, {$IFDEF FPC}JwaTlHelp32, JwaPsApi{$ELSE}TlHelp32, PsAPI{$ENDIF}, ShellAPI; -function GetProcessFileName(const pID: DWORD): string; +function GetProcessFileName(const ProcessID: DWORD): string; function IsAppRunning(const FileName: string): Boolean; function GetThreadFileName(const tID: DWORD): string; -procedure RunAsAdmin(hWnd: HWND; FileName, Parameters: string); +procedure RunAsAdmin(const hWnd: HWND; const FileName, Parameters: string); +function GetProcessModulesCount(const ProcessID: DWORD): integer; {$ENDIF} // MSWINDOWS @@ -25,7 +26,27 @@ implementation {$IFDEF MSWINDOWS} -procedure RunAsAdmin(hWnd: HWND; FileName, Parameters: string); + +function GetProcessModulesCount(const ProcessID: DWORD): integer; +var + h: THandle; + me32: TModuleEntry32; +begin + Result := 0; + + h := CreateToolHelp32Snapshot(TH32CS_SNAPMODULE, ProcessID); + try + me32.dwSize := SizeOf(TModuleEntry32); + if Module32First(h, me32) then + repeat + if me32.th32ProcessID = ProcessID then Inc(Result); + until Integer(Module32Next(h, me32)) = 0; + finally + CloseHandle(h); + end; +end; + +procedure RunAsAdmin(const hWnd: HWND; const FileName, Parameters: string); var {$IFDEF UNICODE} sei: TShellExecuteInfoW; @@ -105,7 +126,7 @@ function IsAppRunning(const FileName: string): Boolean; pe32.dwSize := SizeOf(TProcessEntry32); if integer(Process32First(snap, pe32)) <> 0 then repeat - if UpperCase(FileName) = UpperCase(GetProcessFileName(pe32.th32ProcessID)) then + if AnsiUpperCase(FileName) = AnsiUpperCase(GetProcessFileName(pe32.th32ProcessID)) then begin Result := True; Break; @@ -114,7 +135,7 @@ function IsAppRunning(const FileName: string): Boolean; CloseHandle(snap); end; -function GetProcessFileName(const pID: DWORD): string; +function GetProcessFileName(const ProcessID: DWORD): string; var hProc: HWND; buffer: array[0..1023] of Char; @@ -125,7 +146,7 @@ function GetProcessFileName(const pID: DWORD): string; if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 3) then begin - hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pID); + hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessID); if hProc <> 0 then begin FillChar(buffer{%H-}, SizeOf(buffer), 0); @@ -140,7 +161,7 @@ function GetProcessFileName(const pID: DWORD): string; pe32.dwSize := SizeOf(TProcessEntry32); if integer(Process32First(snap, pe32)) <> 0 then repeat - if integer(pID) = integer(pe32.th32ProcessID) then + if integer(ProcessID) = integer(pe32.th32ProcessID) then begin Result := pe32.szExeFile; Break;