![]() |
prozessliste unter win NT 4.0
Hallo, ich suche eine Api funktion mit der ich mir eine komplette liste mit allen laufenden prozessen erstellen kann. Habe hier schon gesucht und habe die funktion von luckie probiert, läuft aber unter NT 4.0 nicht, hat da jemand vielleicht ein tip für mich??
schon mal Danke im Vorraus |
EnumProcesses.
|
danke probiere es gleich aus!
|
kann sein das diese funktion unter Delph 5 Professional nicht existiert?
|
Im "Rohbau" ja...
Du brauchst die WinAPI32-Header-Übersetzungen der Jedis. Am besten suchst mal hier im Forum. alexander hat die mal angehangen... Chris |
gibt es nicht noch andere möglicheiten sich eine liste zu holen?
|
Nein. Aber warum denn nicht die Headerübersetzungen? Einmal das Verzeichnis in den Suchpfad eingeben, Unit einbinden und fertig.
Wo ist das Problem? Chris PS: Nun gut. Die Funktion an sich wird vermutlich Windows-typisch etwas kryptisch sein, aber dafür ist ja Lucki... ähm... dafür sind wir ja da... :mrgreen: |
ich will mich möglichst fernhalten von irgend welchen zusätzlichen Sachen ausserdem kenne ich mich mit WinAPI32-Header-übersetzungen nicht aus!
|
Moin Lordroc,
für EnumProcesses musst Du nur noch die (Delphi) Unit psapi einbinden. |
oki jetzt habe ich die funktion zur verfügung nur den Aufruf verstehe ich nicht, habe noch nie sone api zeugs gemacht !
Delphi-Quellcode:
was muss ich für lpidprocess, cb, cbneeded übergeben??
enumprocess (lpidprocess: PDWORD; cb: Cardinal; var cbNeeded:Cardinal)
|
Moin Lordroc,
das sollte so gehen:
Delphi-Quellcode:
Die Beschreibung der API Funktionen erhältst Du ansonsten aus dem PSDK (kann heruntergeladen werden) oder online bei msdn.micorsoft.com.
var
pdwResult : PDWORD; // für den Buffer pdwWork : PDWORD; // um dem Buffer verarbeiten zu können dwCountIn : DWORD; // Grösse des Buffers in Byte dwCountOut : DWORD; // Zurückgelieferte Anzahl Byte i : integer; begin dwCountOut := 0; // Sicherheitshalber initialisieren, muss nicht sein dwCountIn := 1024; // Willkürlich gewählt, genügt für 256 Prozesse pdwResult := AllocMem(dwCountIn); try if not EnumProcesses(pdwResult,dwCountIn,dwCountOut) then begin ShowMessage(SysErrorMessage(GetLastError)); end else begin pdwWork := pdwResult; // zur Verarbeitung übergeben, damit FreeMem funktioniert for i := 1 to (dwCountOut shr 2) do begin // shr 2 = / 4, da 4 Byte je DWORD // Prozess Id ausgeben ShowMessage('ProzessId#'+IntToStr(i)+': '+IntToStr(pdwWork^)); // auf nächste addressieren (inc erhöht automatisch um 4, da es ein typisierter Pointer ist inc(pdwWork); end; end; finally FreeMem(pdwResult,dwCountIn); end; end; |
Hi,
ich hatte mal irgendwann diese Prozedur gefunden. Weiss leider nicht mehr von wem die ist, würd den Autor sonst natürlich erwähnen. Klappt hervorragend.
Code:
uses tlhelp32 ;
procedure SnapShot(var sl: TStringlist); var hProcSnap: THandle; pe32: TProcessEntry32; begin hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); if hProcSnap = INVALID_HANDLE_VALUE then exit; pe32.dwSize := SizeOf(ProcessEntry32); if Process32First(hProcSnap, pe32) = true then begin while Process32Next(hProcSnap, pe32) = true do begin sl.Add(pe32.szExeFile); end; end; end; |
Super das funktioniert schon mal! :D :D :D :D :D
gibts jetzt auch die möglichkeit den Name des Prozesses herauszufinden z.b. svchost.exe spoolsv.exe winlogon.exe ?????? |
moin jelly,
die Prozedur kommt von luckie und sie funktioniert unter NT 4.0 nicht aus irgend welchen gründen auch immer! |
Zitat:
Gruss, tom |
Sie funktioniert deswegen nicht unter NT, weil unter NT4.0 es keine Tlhelp32.dll gibt. Microsoft hat damals für NT4 alles neu implementiert und diese Funktionen in die PSAPI gesteckt - aus was für einen Grund auch immer.
|
typisch MS nix wird vernünftig gemacht!
|
Sie werden schon ihre Gründe gehabt haben. Schließlich wollten sie mit NT ja die DOS-Altlasten los werden. Und da hat eben nichts an einer Neuimplementierung vorbei geführt.
|
kannst du mir zufällig helfen den Code von "Christian Seehase" so zu erweitern, dass ich die Prozessnamen erhalte? ich kapiere nähmlich nicht viel von Api's.
|
Delphi-Quellcode:
uses
PSAPI; function GetProcessName(PID: DWORD): String; var hProcess: cardinal; buffer : array [0..MAX_PATH-1] of Char; begin result := ''; Zeromemory(@buffer, sizeof(buffer)); hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, PID); if hProcess <> 0 then begin GetModulebaseName(hProcess, 0, buffer, sizeof(buffer)); result := String(buffer); CloseHandle(hProcess); end end; procedure TForm1.Button1Click(Sender: TObject); var pdwResult : PDWORD; // für den Buffer pdwWork : PDWORD; // um dem Buffer verarbeiten zu können dwCountIn : DWORD; // Grösse des Buffers in Byte dwCountOut : DWORD; // Zurückgelieferte Anzahl Byte i : integer; begin dwCountOut := 0; // Sicherheitshalber initialisieren, muss nicht sein dwCountIn := 1024; // Willkürlich gewählt, genügt für 256 Prozesse pdwResult := AllocMem(dwCountIn); try if not EnumProcesses(pdwResult,dwCountIn,dwCountOut) then begin ShowMessage(SysErrorMessage(GetLastError)); end else begin pdwWork := pdwResult; // zur Verarbeitung übergeben, damit FreeMem funktioniert for i := 1 to (dwCountOut shr 2) do begin // shr 2 = / 4, da 4 Byte je DWORD // Prozess Id ausgeben //ShowMessage('ProzessId# '+IntToStr(i)+': '+IntToStr(pdwWork^)); ShowMessage(GetProcessName(pdwWork^)); // auf nächste addressieren (inc erhöht automatisch um 4, da es ein typisierter Pointer ist inc(pdwWork); end; end; finally FreeMem(pdwResult,dwCountIn); end; end; |
Danke Danke funktioniert alles danke für eure Hilfe!!! :hello: :hello: :hello:
|
Zitat:
Grundsätzlich funktioniert diese Prozedur fehlerfrei, jedoch kann es sein, dass es Probleme unter Windows 98 gibt? Einige Nutzer eines meiner Programme meldeten mir einen recht merkwürdigen Fehler und meine Recherche führte zu diesem Teil des Quellcodes. Thx & Greetz |
Re: prozessliste unter win NT 4.0
elche Prozedur kommt von mir? Und um an bestimmte Infos zu kommen braucght man Debugg-Rechte.
|
Re: prozessliste unter win NT 4.0
die hast du doch 2 posts über mir gepostet ...
Da die Prozedur bei mir so läuft, kann ich den Fehler lokal nicht ausfindig machen. Zugang zu dem Rechner des Users, der die Support-Anfrage gestellt hat, hab ich natürlich nicht. Daher wollte ich nur fragen, ob solch ein Problem bekannt ist und es eventuell eine alternative Methode zum Lesen der Prozessliste gibt, die unter allen Windows-Versionen problemlos funktioniert. |
Re: prozessliste unter win NT 4.0
PSAPI ist leider nicht auf allen NT4 Distributionen mit dabei.
Dann funktioniert EnumProcesses() nicht. Es gibt auch die Möglichkeit, die Prozesse aus der Registry auszulesen. Siehe z.B ![]() |
Re: prozessliste unter win NT 4.0
danke, ich werde es mal über diese unit implementieren und hoffen, dass es vielleicht auch das Prob mit einigen Win98 Usern behebt.
|
Re: prozessliste unter win NT 4.0
Hallo? Wir reden hier die ganze Zeit davon, dass es die PSAPI nur unter NT gibt, kein Wunder dass es unter 98 nicht geht.
|
Re: prozessliste unter win NT 4.0
CreateToolHelp32SnapShot nur auf Win2000 + 98(etc) glaube ich.
Unter NT ist es wie bereits gesagt EnumProcesses. Wenn dein Prog unter allen Windows-Versionen laufen soll musst du mit GetVersion das laufende OS bestimmen und die entsprechende Funktion aufrufen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:42 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