![]() |
Alle Threads einer laufenden Anwendung ermitteln
Delphi-Quellcode:
Beitrag von Chewie.
type
TDWordList = Array of DWord; function GetThreadID(const FileName: String): TDWordList; var ToolHnd, MToolHnd: THandle; PE32: TProcessEntry32; ME32: TModuleEntry32; TE32: TThreadEntry32; PIDArray, ThreadArray: TDWordList; a: Integer; PID: DWord; begin PIDArray := nil; ThreadArray := nil; ToolHnd := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS or TH32CS_SNAPTHREAD, 0); //Handle auf Snapshot if ToolHnd = INVALID_HANDLE_VALUE then RaiseLastWin32Error; try PE32.dwSize := SizeOf(ProcessEntry32); if not Process32First(ToolHnd, PE32) then RaiseLastWin32Error; //erster Prozess repeat if CompareText(PE32.szExeFile, ExtractFileName(FileName)) = 0 then begin SetLength(PIDArray, Length(PIDArray) + 1); PIDArray[Length(PIDARRAY) - 1] := PE32.th32ProcessID; end; until not Process32Next(ToolHnd, PE32); { Jetzt sind alle PIDs der Prozesse, deren Dateinamen gleich dem gesuchten ist, gespeichert } { Jetzt wird für jeden Prozess anhand der Modulliste der vollständige Pfad ermittelt und so } { die endgültige, richtige ProcessID ermittelt. } PID := 0; for a := 0 to Length(PIDArray) -1 do begin MToolHnd := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PIDArray[a]); //Modulliste des gewählten Prozesses if MToolHnd = INVALID_HANDLE_VALUE then RaiseLastWin32Error; try ME32.dwSize := SizeOf(TModuleEntry32); if not Module32First(MToolhnd, ME32) then RaiseLastWin32Error; repeat if CompareText(ME32.szExePath, FileName) = 0 then begin PID := ME32.th32ProcessID; Break; end; until not Module32Next(MToolHnd, ME32); finally CloseHandle(MToolHnd); end; if PID <> 0 then Break; end; { Jetzt werden alle Threads des Prozesses ermittelt } TE32.dwSize := SizeOf(ThreadEntry32); if not Thread32First(ToolHnd, TE32) then RaiseLastWin32Error; repeat if TE32.th32OwnerProcessID = PID then begin SetLength(ThreadArray, Length(ThreadArray) + 1); ThreadArray[Length(ThreadArray) - 1] := TE32.th32ThreadID; end; until not Thread32Next(ToolHnd, TE32); finally CloseHandle(ToolHnd); end; if Length(ThreadArray) > 0 then begin Result := ThreadArray; end else Result := nil; end; [edit=Matze][code] durch [delphi]-Tags ersetzt. Mfg, Matze[/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz