![]() |
Handle- + Prozess-Fragen
Hi,
ich habe mehrere Probleme:
Die Fragen daher, da ich bisher noch nie mit Handles gearbeitet habe... Chris |
Moin Chris,
Ganz allgemein: Handle sind eingentlich nur Identifikationsnummern, mit denen bestimmte Objekte erkannt bzw. angesprochen werden können. In diesen ist auch kodiert (leider weiss ich nicht wie) um was für ein Handle es sich handelt, damit die Funktionen auch ermitteln können ob das Handle für sie überhaupt gültig sein kann. Es ist ja, z.B., unsinnig an GetWindowText ein Dateihandle zu schicken. |
Danke für die Antwort!
Chris |
Re: Handle- + Prozess-Fragen
Zitat:
Nachfolgende Funktion ermittelt u. a. alle Thread-IDs einer laufenden Anwendung. Anschließend könntest du mit EnumThreadWindows und EnumChildWindow alle Handles ermitteln.
Delphi-Quellcode:
Du musst außerdem noch die Unit TlHelp32 einbinden und noch folgenden Typ deklarieren:
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;
Delphi-Quellcode:
type
TDWordList = Array of DWord; |
Weiteres Anschauungsmaterial wäre mein Prozess-Betrachter auf meiner Seite.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 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 by Thomas Breitkreuz