Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2017, 10:49   #1
tooBot
Пользователь
 
Регистрация: 10.05.2017
Сообщений: 12
По умолчанию Получение списка процессов

Доброго времени суток, дорогие форумчане.
Столкнулся с небольшой проблемой.
Для моего проекта мне необходимо получить список запущенных процессов. Создал свою библиотеку, которая собственно этим и занимается.
Код:
library getProc;

{Библиотека списка процессов. Получает список процессов и хранит их в файле.}

uses
  SysUtils,
  Windows,
  ShellAPI,
  Classes,
  messages,
  Registry,
  TlHelp32;

{$R *.res}
procedure getProccessList;
var
  stdPath : PAnsiChar;        //путь к файлу
  hFile : THandle;            //идентификатор (хэндл) приложения
  Buffer : cardinal;          //буфер для записи
  str : string;               //строка, передаваемая в файл
  ProcInfo: TProcessEntry32;
  hSnapShot: THandle;
begin
  stdPath:='proc.dmp';
  hFile:=CreateFile(stdPath, GENERIC_WRITE, 0, nil , CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnapShot <> THandle(-1)) then
  begin
    ProcInfo.dwSize := SizeOf(ProcInfo);
    if (Process32First(hSnapshot, ProcInfo)) then
    begin
      str:=ProcInfo.szExeFile + '' + #13;
      while (Process32Next(hSnapShot, ProcInfo)) do
      begin
        FileSeek(hFile,GetFileSize(hFile,nil),0);
        WriteFile(hFile, PAnsiChar(str)^, Length(str), Buffer, Nil);
      end;
    end;
    CloseHandle(hSnapShot);
    CloseHandle(hFile) ;
  end;
end;
exports  getProccessList;
begin

end.
Собственно, что получаем на выходе:
Код:
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
[System Process]
Запускал от имени администратора. Результатов не дало.
Регистрация библиотеки в системе так же не поможет, т.к. запускал такой код напрямую из программы. Результат тот же.
Понимаю что проблема в правах доступа, но вот как решить - не знаю.
Надеюсь на Вашу помощь.
tooBot вне форума Ответить с цитированием
Старый 10.05.2017, 11:43   #2
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Цитата:
Сообщение от tooBot Посмотреть сообщение
Понимаю что проблема в правах доступа, но вот как решить - не знаю.
Проблема в том, что str:=ProcInfo.szExeFile + '' + #13; находится вне цикла while...
И вообще можно сделать проще:
Код:
uses
  TlHelp32;

procedure GetProcessList;
const
  cFileName = 'ProcessList.txt';
var
  ProcessSnap: THandle;
  PE32: TProcessEntry32;
  F: TextFile;
begin
  ProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if ProcessSnap <> INVALID_HANDLE_VALUE then
  begin
    PE32.dwSize := SizeOf(TProcessEntry32);
    if Process32First(ProcessSnap, PE32) then
    begin
      AssignFile(F, cFileName);
      Rewrite(F);
      repeat
        WriteLn(F, PE32.szExeFile);
      until not Process32Next(ProcessSnap, PE32);
      CloseFile(F);
    end;
    CloseHandle(ProcessSnap);
  end;
end;
Или:
Код:
procedure GetProcessList;
const
  cFileName = 'ProcessList.txt';
var
  ProcessSnap: THandle;
  PE32: TProcessEntry32;
begin
  ProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if ProcessSnap <> INVALID_HANDLE_VALUE then
  begin
    PE32.dwSize := SizeOf(TProcessEntry32);
    if Process32First(ProcessSnap, PE32) then
    begin
      with TStringList.Create do
        try
          repeat
            Add(PE32.szExeFile);
          until not Process32Next(ProcessSnap, PE32);
          SaveToFile(cFileName);
        finally
          Free;
        end;
    end;
    CloseHandle(ProcessSnap);
  end;
end;

Последний раз редактировалось Filka; 10.05.2017 в 12:17.
Filka вне форума Ответить с цитированием
Старый 10.05.2017, 15:38   #3
tooBot
Пользователь
 
Регистрация: 10.05.2017
Сообщений: 12
По умолчанию

Спасибо, помогло)
tooBot вне форума Ответить с цитированием
Старый 11.05.2017, 06:14   #4
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Пожалуйста.
Filka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
получение списка безопасности папки Azamat0 Общие вопросы C/C++ 5 24.04.2016 23:34
Indy TCPClient, TCPServer получение списка процессов с удаленного компьютера WildWest Работа с сетью в Delphi 3 02.03.2011 08:48
Получение списка процеcсов legendary Win Api 12 02.09.2010 18:06
Получение списка файлов Костян Пират Общие вопросы Delphi 11 16.02.2009 09:58
получение 1 списка из 2-х Neznau Помощь студентам 0 10.12.2008 22:16