Как получить полный путь к исполняемым файлам запущенных процессов с помощью JCL
При работе с процессами в операционных системах семейства Windows часто возникает необходимость получения полного пути к исполняемым файлам этих процессов. В контексте разработки на Delphi и использовании Object Pascal, одной из популярных библиотек для работы с системной информацией является JCL (Joint Code Library).
Проблема
При использовании функции JclSysInfo.RunningProcessesList для получения списка запущенных процессов, вы можете столкнуться с ситуацией, когда некоторые из процессов возвращаются только с именами исполняемых файлов, в то время как другие содержат полный путь к файлу. Например:
Для получения полного пути к исполняемым файлам всех процессов, вы можете использовать функцию Windows API QueryFullProcessImageName, которая доступна начиная с Windows Vista. Эта функция требует меньших прав доступа, чем GetModuleFileNameEx, и может быть использована в случае, если невозможно открыть обработчик процесса.
Вот пример кода на Object Pascal, который демонстрирует использование QueryFullProcessImageName для получения полного пути к исполняемым файлам процессов:
program GetFullPathOfRunningProcesses;
{$APPTYPE CONSOLE}
uses
..., JclSysInfo, Windows;
procedure GetFullPathOfProcess(processId: DWORD; var fullPath: string);
var
bufferSize: DWORD;
begin
// Определяем размер буфера для полного пути
bufferSize := SizeOf(fullPath);
if not QueryFullProcessImageName(processId, 0, PChar(fullPath), bufferSize) then
begin
// Обработка ошибки, например, получение кода ошибки
raise LastWin32Error;
end;
end;
procedure GetRunningProcesses;
var
processInfo: TProcessInformation;
fullPath: string;
begin
fullPath := StringOfMaxSize; // Инициализация строки с максимально возможным размером
// Итерация по всем процессам
if OpenProcessSnapshot then
try
repeat
if ReadProcessSnapshot(processInfo) then
begin
// Получаем полный путь к исполняемому файлу
GetFullPathOfProcess(processInfo.ProcessID, fullPath);
// Выводим информацию о процессе
Writeln('Process ID: ', processInfo.ProcessID, ', FullPath: ', fullPath);
end;
until not ReadProcessSnapshot(processInfo);
finally
CloseProcessSnapshot;
end;
end;
begin
GetRunningProcesses;
Readln;
end.
Обратите внимание, что для работы с QueryFullProcessImageName вам потребуется открыть обработчик для каждого процесса, что может потребовать определенных прав доступа.
Комментарии и дополнительная информация
Процесс "Everything" запускается с повышенными правами. Попробуйте запустить ваше приложение аналогично.
При компиляции программы для 64-битной архитектуры количество процессов с полным путем к файлу увеличивается. Однако это не гарантирует, что все процессы будут возвращены с полным путем.
Использование QueryFullProcessImageName может быть ограничено из-за прав доступа. Если не удается открыть обработчик процесса, то и получить полный путь не получится.
Использование JCL и функций Windows API позволяет разработчикам на Delphi получать детальную информацию о запущенных процессах, что может быть полезно для мониторинга системных ресурсов, отладки и других задач.
Как получить полный путь к исполняемым файлам запущенных процессов, используя библиотеку JCL для разработки на Delphi и функции Windows API.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.