Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ошибка 87 при получении полного пути процесса в Delphi: решение проблемы

Delphi , Программа и Интерфейс , Процессы и Сервисы

При работе с компонентом 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Процессы и Сервисы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 14:53:40/0.0031998157501221/0