При работе с компонентом TProcessInfo для получения списка запущенных процессов, пользователи иногда сталкиваются с ошибкой 87, которая возникает при попытке получить полный путь процесса. В данной статье мы рассмотрим, что может быть причиной этой ошибки, и как её можно решить, используя язык программирования Object Pascal и среду разработки Delphi.
Описание проблемы
Компонент TProcessInfo предназначен для получения информации о запущенных процессах, включая их идентификаторы и полные пути. При использовании этого компонента в сочетании с ListView для отображения данных, пользователи могут столкнуться с системной ошибкой 87, когда параметр некорректен. Это происходит на последней строке кода, где пытаются добавить полный путь процесса в ListView.
Пример кода, вызывающего ошибку:
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
Process: TProcessItem;
begin
for i := 0 to ProcessInfo1.RunningProcesses.Count - 1 do
begin
Process := ProcessInfo1.RunningProcesses[i];
with lv.Items.Add do
begin
Caption := Process.ExeFile;
SubItems.Add(IntToStr(Process.ProcessID));
SubItems.Add(Process.FullPath); // Ошибка возникает здесь
end;
end;
end;
Функция, отвечающая за получение полного пути процесса в компоненте, использует OpenProcess и GetModuleFileNameEx, что может привести к ошибке, если параметры этих функций некорректны.
Причины ошибки
Ошибка 87 обычно указывает на неверные параметры, передаваемые в системные функции Windows. В случае с TProcessInfo, проблема может быть связана с неправильным идентификатором процесса (PID) или некорректным использованием функций OpenProcess и GetModuleFileNameEx.
Решение проблемы
Исходя из обсуждения в контексте, проблема заключается в том, что OpenProcess не может открыть дескриптор процесса с PID = 0, так как это системный процесс бездействия. Решение заключается в исключении из обработки процессов с таким PID.
Пример кода, исключающего процесс с PID=0:
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
Process: TProcessItem;
begin
for i := 0 to ProcessInfo1.RunningProcesses.Count - 1 do
begin
Process := ProcessInfo1.RunningProcesses[i];
if Process.ProcessID > 0 then // Исключаем процесс с PID=0
begin
with lv.Items.Add do
begin
Caption := Process.ExeFile;
SubItems.Add(IntToStr(Process.ProcessID));
SubItems.Add(Process.FullPath);
end;
end;
end;
end;
Также стоит учесть, что для некоторых процессов может не хватить прав для получения дескриптора процесса, что приведёт к ошибке доступа (код 5).
Заключение
При работе с TProcessInfo важно обращать внимание на PID процессов и корректно обрабатывать исключения. Используя предложенное выше решение, можно избежать ошибки 87 при получении полного пути процесса в Delphi.
При использовании компонента `TProcessInfo` в Delphi для получения информации о процессах может возникнуть ошибка 87 при попытке получить полный путь процесса, особенно если процесс имеет PID равный 0 или отсутствуют права доступа.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.