lista procesów (wraz ze ścieżkami)

0

cześć. doszukałem się takiego przykładu:

[code]
uses TlHelp32;

procedure TForm1.btnAddEXEClick(Sender: TObject);
var
_HWND : THandle;
Proc : TProcessEntry32;
begin
_HWND := CreateToolHelp32SnapShot(TH32CS_SNAPALL,0);

Proc.dwSize:=SizeOf(Proc); // okresl rozmiar struktory

if Integer(Process32First(_HWND, Proc)) <> 0 then
repeat
ListBox1.Items.Add(Proc.szExeFile);
until Integer(Process32Next(_HWND, Proc)) = 0; // dopoki wartosc nie osiagnie 0

CloseHandle(_HWND);
end;
[/code]

lecz to wyświetla same nazwy procesów (np. cośtam.exe). jak to przerobić aby wyświetlało procesy wraz ze scieżkami? szukałem na różnych FAQ i tam tylko jest to co wyżej podałem....

0

nie wiem, ale powiem że na Win 95/98/ME szExeFile przechowuje też ścieżkę

0

właśnie ale na NT nie podaje ścieżki tylko same exeki.... :(

0

w NT służą do tego funkcje EnumProcesses, GetModuleFileNameEx z biblioteki psapi.dll

0

Możesz zrobić też tak :

uses PsAPI;

function ListaProcesow(Lista: TStrings): Boolean;
var
PIDs: array[0..1024] of DWORD;
Handle: THandle;
Needed: DWORD;
i: integer;
ModuleFileName: array[0..MAX_PATH] of char;
ListIndex: Integer;
MemoryString: string;
begin
if (Win32Platform = VER_PLATFORM_WIN32_NT) and
(Win32MajorVersion > 3) then
begin
Result := EnumProcesses(@PIDs, Sizeof(PIDs), Needed);
if Result then
begin
for i := 0 to (Needed div Sizeof(DWORD)) - 1 do
begin
if PIDs[i] <> 0 then
begin
Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
False, PIDs[I]);
if Handle <> 0 then
begin
if GetModuleFileNameEx(Handle, 0, ModuleFileName,
Sizeof(ModuleFileName)) <> 0 then
begin
List.Add(ModuleFileName);
end;
end;
CloseHandle(Handle);
end;
end;
end;
end
else
Result := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if ListaProcesow(memo1.lines) then //Tu już twoja działka
end;

Jeżeli interesuje Cię też rozmiar procesu to daj znać ....

// String(PChar(String(pe.szExeFile))) - geez, co to jest??? - Ł

0

To ja dorzuce jeszcze jeden dla potomności, pokazuje ścieżkę po numerze PID procesu:

uses PsApi;

function ProcessFileName(PID: DWORD): string;
var
  Handle: THandle;
begin
    Result := '';
    Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
 if Handle <> 0 then try
    SetLength(Result, MAX_PATH); begin
 if GetModuleFileNameEx(Handle, 0, PChar(Result), MAX_PATH) > 0 then
    SetLength(Result, StrLen(PChar(Result))) else Result := ''; end;
 finally CloseHandle(Handle); end;
end;
0

To ja, dla pełni sukcesu, dorzuce Ci jak pobrać PID z nazwy procesu...

uses tlhelp32;

function GetPID(FileName : string) : cardinal;
var
  hSnap : hwnd;
  Found : Boolean;
  pe : ProcessEntry32;
begin
  result := INVALID_HANDLE_VALUE;
  hSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
  if hSnap = NULL then begin
    ShowMessage('Error creating snapshot.');
    Exit;
  end;
  pe.dwSize := SizeOf(ProcessEntry32);
  Found := Process32First(hSnap,pe);
  while found do begin
    if
pos(Uppercase(FileName),Uppercase(String(PChar(String(pe.szExeFile))))) >
0 then begin
      result := pe.th32ProcessID;
      CloseHandle(hSnap);
      exit;
    end;
    Found := Process32Next(hSnap,pe);
  end;
  CloseHandle(hSnap);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Handle : THandle;
  PID : Cardinal;
begin
  PID := GetPID('ftp.exe');
  if PID <> INVALID_HANDLE_VALUE then
    Handle := OpenProcess(PROCESS_ALL_ACCESS,False,PID);
    TerminateProcess(Handle,0);
    CloseHandle(Handle);
  end else
    ShowMessage('Process not found!');
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1