![]() |
Prozesspfad herausfinden
Hallo liebe DPler,
ich habe eine Frage wegen einer meiner Programme, die ihr mir hoffentlich beantworten könnt. Vorneweg, ich bin mit der Windows-API ziemlich ungeschickt, oder treffender: Ich habe keine Ahnung davon. Nun zum Problem. Ich würde gerne eine Art Protokollprogramm erstellen, das alle, beipspielsweise, 5 Minuten die laufenden Prozesse ermittelt, die entsprechende Liste filtert (bekannt/unbekannt) und am Ende alles schön säuberlich in eine .log-Datei wirft. Soweit kein Problem, aber ich möchte für die nicht bekannten Prozesse noch Programmpfad herausfinden, damit der Anwender bessere Chancen hat herauszufinden, um welches Programm es gerade geht. Das geht ja oft aus dem Prozessnamen nicht hervor. Um die laufenden Prozesse zu ermitteln habe ich mich folgender Prozedur bedient, wobei ich zugeben muss, dass ich diese von Delphi-Source habe, da ich damit nicht so wirklich zurande kommen würde:
Delphi-Quellcode:
Ich bedanke mich schonmal für eure Hilfe, Palad
procedure TFrmAnsicht.GetProcessList(const aProcessList: TStrings);
var Snap: THandle; ProcessE: TProcessEntry32; begin aProcessList.Clear; Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); try ProcessE.dwSize := SizeOf(ProcessE); if Process32First(Snap, ProcessE) then Repeat aProcessList.Add(ProcessE.szExeFile); Until not Process32Next(Snap, ProcessE) else RaiseLastOSError; finally CloseHandle(Snap); end; end; PS: Ich bei Delphi-Source auch schon die Frage gepostet forum.dsdt.info/viewtopic.php?t=33998 |
Re: Prozesspfad herausfinden
Delphi-Quellcode:
wobei modh ein THandle ist und ModuleE en TModuleEntry32modh := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessE.ProcessID); if (modh <> 0) then begin if Modul32First(modh, ModuleE) then //ModuleE.szExeName ist die Exe mit Pfad) CloseHandle(modh); end; die funktion einfach nach an den beginn der repeat schleife packen (hoffe da ist kein fehler drin, habs ausm kopf geschrieben) |
Re: Prozesspfad herausfinden
Es klappt (fast) mit deinem Code! Bis auf 2 Dinge die ich verändern musste, zum einen scheint es bei modh:=Create...(..., ProcessE.th32ProcessID) heißen zu müssen [habe einfach die entsprechende Unit durchgesehen] und ModuleE.szExePath, aber du hast mir riesig geholfen! Dankesehr, ich weiß das wirklich zu schätzen!
Delphi-Quellcode:
procedure TFrmAnsicht.GetProcessList(const aProcessList: TStrings);
var Snap: THandle; ProcessE: TProcessEntry32; modh: THandle; ModuleE: TModuleEntry32; begin aProcessList.Clear; Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); try ProcessE.dwSize := SizeOf(ProcessE); if Process32First(Snap, ProcessE) then Repeat begin // hier beginnen die Änderungen modh:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessE.th32ProcessID); if (modh <> 0) then begin if Module32First(modh, ModuleE) then Memo1.Lines.Add(ModuleE.szExePath); CloseHandle(modh); end; // Änderungen Ende. aProcessList.Add(ProcessE.szExeFile); end; Until not Process32Next(Snap, ProcessE) else RaiseLastOSError; finally CloseHandle(Snap); end; end; Viele Grüße, Palad :bounce1: |
Re: Prozesspfad herausfinden
Der Code ist echt super!
Zwei Kleinigkeiten musste ich aber noch ändern. Zum einen war mind. ein begin end; zuviel. Zum anderen wird einmal ein Add nicht zu aProcessList, sondern zu Memo.Lines gemacht. Den alten Thread greife ich wieder auf, weil ich trotzdem noch zwei Fragen habe:
Gruß und Dank, Alex |
Re: Prozesspfad herausfinden
Welche Prozesse fehlen denn? Eventuell fehlen dir für bestimmte Prozesse die nötigen Rechte.
|
Re: Prozesspfad herausfinden
Danke für die Antwort!
Zitat:
Der Taskmanager zeigt mir 38 Prozesse mit exe-Dateien an. Mit der Procedur bekomme ich nur 8 angezeigt. Davon ist mein Programm selbst - warum auch immer - doppelt. Zitat:
Andere Ideen? |
Re: Prozesspfad herausfinden
Das sind alles Systemprozesse.
Und auch als Administrator ist man nicht allmächtig. ;) PS: ctfmon.exe gehört zu Office und dient der Spracherkennung von texten oder so. |
Re: Prozesspfad herausfinden
Hab den Code von Palad mal ein wenig "bereinigt" und übersichtlicher gestaltet:
Delphi-Quellcode:
Guido.
uses
Tlhelp32; procedure GetProcessList(const aProcessList: TStrings); var Snap: THandle; ProcessE: TProcessEntry32; modh: THandle; ModuleE: TModuleEntry32; begin aProcessList.Clear; Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (Snap <> INVALID_HANDLE_VALUE) then begin try ProcessE.dwSize := SizeOf(ProcessE); if Process32First(Snap, ProcessE) then Repeat aProcessList.Add(ProcessE.szExeFile); modh := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessE.th32ProcessID); if (modh <> INVALID_HANDLE_VALUE) then begin try ModuleE.dwSize := SizeOf(ModuleE); if Module32First(modh, ModuleE) then // repeat // <- wer's gerne noch ausfuerlicher will aProcessList.Add(ModuleE.szExePath) // until not Module32Next(modh, ModuleE) else RaiseLastOSError; finally CloseHandle(modh); end; end; Until not Process32Next(Snap, ProcessE) else RaiseLastOSError; finally CloseHandle(Snap); end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin GetProcessList(Memo1.Lines); end; |
Re: Prozesspfad herausfinden
Zitat:
|
Re: Prozesspfad herausfinden
Hy,
Was muss man in der uses Direktive denn ergänzen dass der Code läuft? Bei mir wird: TProcessEntry32 und CreateToolHelp32SnapShot unterringelt. Da hab ich doch bestimmt was vergessen einzubinden? Danke !!!! Grüße Andi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 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