Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi prozessliste unter win NT 4.0 (https://www.delphipraxis.net/5539-prozessliste-unter-win-nt-4-0-a.html)

lordcroc 10. Jun 2003 17:53


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

Luckie 10. Jun 2003 18:03

EnumProcesses.

lordcroc 10. Jun 2003 19:48

danke probiere es gleich aus!

lordcroc 10. Jun 2003 19:52

kann sein das diese funktion unter Delph 5 Professional nicht existiert?

CalganX 10. Jun 2003 19:54

Im "Rohbau" ja...
Du brauchst die WinAPI32-Header-Übersetzungen der Jedis. Am besten suchst mal hier im Forum. alexander hat die mal angehangen...

Chris

lordcroc 10. Jun 2003 19:59

gibt es nicht noch andere möglicheiten sich eine liste zu holen?

CalganX 10. Jun 2003 20:03

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:

lordcroc 10. Jun 2003 20:09

ich will mich möglichst fernhalten von irgend welchen zusätzlichen Sachen ausserdem kenne ich mich mit WinAPI32-Header-übersetzungen nicht aus!

Christian Seehase 10. Jun 2003 20:19

Moin Lordroc,

für EnumProcesses musst Du nur noch die (Delphi) Unit psapi einbinden.

lordcroc 10. Jun 2003 20:24

oki jetzt habe ich die funktion zur verfügung nur den Aufruf verstehe ich nicht, habe noch nie sone api zeugs gemacht !
Delphi-Quellcode:
enumprocess (lpidprocess: PDWORD; cb: Cardinal; var cbNeeded:Cardinal)
was muss ich für lpidprocess, cb, cbneeded übergeben??

Christian Seehase 10. Jun 2003 20:40

Moin Lordroc,

das sollte so gehen:

Delphi-Quellcode:
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;
Die Beschreibung der API Funktionen erhältst Du ansonsten aus dem PSDK (kann heruntergeladen werden) oder online bei msdn.micorsoft.com.

Jelly 10. Jun 2003 20:48

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;

lordcroc 10. Jun 2003 20:49

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

??????

lordcroc 10. Jun 2003 20:50

moin jelly,

die Prozedur kommt von luckie und sie funktioniert unter NT 4.0 nicht aus irgend welchen gründen auch immer!

Jelly 10. Jun 2003 20:54

Zitat:

Zitat von lordcroc
die Prozedur kommt von luckie und sie funktioniert unter NT 4.0 nicht aus irgend welchen gründen auch immer!

Hab ich gleich im Code vermerkt. Dank an Luckie.

Gruss,
tom

Luckie 10. Jun 2003 21:20

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.

lordcroc 10. Jun 2003 21:23

typisch MS nix wird vernünftig gemacht!

Luckie 10. Jun 2003 21:29

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.

lordcroc 10. Jun 2003 21:33

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.

Luckie 10. Jun 2003 22:07

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;

lordcroc 10. Jun 2003 22:26

Danke Danke funktioniert alles danke für eure Hilfe!!! :hello: :hello: :hello:

Unplugged 14. Apr 2004 15:15

Zitat:

Zitat von Luckie
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;

Hallo!

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

Luckie 14. Apr 2004 16:33

Re: prozessliste unter win NT 4.0
 
elche Prozedur kommt von mir? Und um an bestimmte Infos zu kommen braucght man Debugg-Rechte.

Unplugged 14. Apr 2004 17:15

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.

toms 14. Apr 2004 17:24

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 http://www.madshi.net/enumStuff.zip

Unplugged 14. Apr 2004 17:28

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.

Luckie 14. Apr 2004 19:29

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.

Vjay 14. Apr 2004 21:34

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 18:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz