kwadratens
kwadratens

Reputation: 345

Delphi: how can i get list of running applications with starting path?

Using Delphi (windows app) i want to get list of other applications running currently. Here How to check if a process is running using Delphi? i've found great tutorial about geting filenames/names of running application, however it gives names only process name (for example NOTEPAD.EXE). I've used naturally part with

UpperCase(ExtractFileName(FProcessEntry32.szExeFile))

and

UpperCase(ExtractFilePath(FProcessEntry32.szExeFile))

and just

UpperCase(FProcessEntry32.szExeFile)

but obviously FProcessEntry32.szExeFile does not have a path to file/process

Is there a simply way of getting list with paths? Here's How to get the list of running processes including full file path? solution with JclSysInfo library, but i cant use it in place of work in project.

I looked at what I could in Google and what I found usually concerned just the application that is running or the application that is active, but I can't just find a list of all running applications. Maybe i'm missing something obvious?

I'm not looking for any complex procedures, I'm not much interested in process parrent, or if there is no access to the process path, I don't have it and don't bother.

Any simple hint?

OK, due to helpfull comment from @TLama i've combined topics above to take name and path of process:

function processExists(exeFileName: string): Boolean;
var
  ContinueLoopP, ContinueLoopM: BOOL;
  FSnapshotHandle1, FSnapshotHandle2: THandle;
  FProcessEntry32: TProcessEntry32;
  FMODULEENTRY32: TMODULEENTRY32;
begin
  FSnapshotHandle1 := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  FMODULEENTRY32.dwSize := SizeOf(FMODULEENTRY32);
  ContinueLoopP := Process32First(FSnapshotHandle1, FProcessEntry32);
  ContinueLoopM := Module32First(FSnapshotHandle2, FMODULEENTRY32);
  Result := False;
  while Integer(ContinueLoopP) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
      Result := True;
    ShowMessage(FMODULEENTRY32.szExePath + FProcessEntry32.szExeFile);
    ContinueLoopP := Process32Next(FSnapshotHandle1, FProcessEntry32);
    ContinueLoopM := Module32Next(FSnapshotHandle2, FMODULEENTRY32);
  end;
  CloseHandle(FSnapshotHandle1);
  CloseHandle(FSnapshotHandle2);
end;

But still FProcessEntry32.szExeFile returns empty string. What i'm doing wrong? Thank You in advance.

Upvotes: 3

Views: 2734

Answers (1)

M1209
M1209

Reputation: 51

I cannot write comment (low score), so I need to write as "answer". Try this code, using FProcessEntry32.th32ProcessID as parameter:

Function QueryFullProcessImageNameW(hProcess:THandle; dwFlags:Cardinal; lpExeName:PWideChar; Var lpdwSize:Cardinal) : Boolean; StdCall; External 'Kernel32.dll' Name 'QueryFullProcessImageNameW';

Function GetFullPath(Pid:Cardinal) : UnicodeString;
         Var   rLength:Cardinal;
               Handle:THandle;
         Begin Result:='';
               Handle:=OpenProcess(PROCESS_QUERY_INFORMATION, False, Pid);
               If Handle = INVALID_HANDLE_VALUE Then Exit;
               rLength:=256; // allocation buffer
               SetLength(Result, rLength+1); // for trailing space
               If Not QueryFullProcessImageNameW(Handle, 0, @Result[1],rLength) Then  Result:='' Else SetLength(Result, rLength);
               End;

This is a simple way I think. If you want to get the loaded DLL's full name, use FMODULEENTRY32.hModule with GetModuleFileNameW function.

Upvotes: 3

Related Questions