Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:31 Uhr.
Seite 2 von 3     12 3      

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