Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.10.2013, 23:51
Flashton Flashton вне форума
Прохожий
 
Регистрация: 11.05.2010
Сообщения: 8
Репутация: 10
Вопрос Получение информации о выполняемых процессах

Здравствуйте. Делаю программу в Delphi XE2, которая выдаёт информацию о выполняющихся в данный момент процессах.
На форму добавил мемо-поле "Info" (в которое грузится информация) и кнопку "Button4", в которой разместил код с API-функцией.
На одном из компьютеров я запустил проект (нажал Run) через Delphi 7, он работал правильно (показал 23 процесса), но у меня и на других компьютерах скомпилированный XE2 exe-файл показывает, что выполняется 1 процесс (его имя не показывает). Почему так, подскажите, пожалуйста? Может это Delphi XE2 виноват?
Код:
procedure TForm1.Button4Click(Sender: TObject);
var
SH:Cardinal;
Num,I:Integer;
PPE:TProcessEntry32;
Full_Path:string;
begin
Num:=0;
SH:=CreateToolHelp32SnapShot(Th32cs_SnapAll, 0);
Process32First(SH,PPE);
Full_Path:=PPE.szExeFile;
Info.Text:=(Full_path);
Num:=Num+1;

while Process32Next(SH, PPE) do
  begin
  Full_Path:=PPE.szExeFile;
  Info.Lines.Add(Full_path);
  Num:=Num+1;
  end;
  CloseHandle(SH);

Info.Lines.Add('Число процессов: '+IntToStr(Num));
end;
Ответить с цитированием
  #2  
Старый 17.10.2013, 01:30
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Flashton
...Может это Delphi XE2 виноват?
Вполне вероятно, попробовал тоже этот код на D7 - работает правильно.

А если так
Код:
uses
 TlHelp32,Psapi;
procedure TForm1.Button4Click(Sender: TObject);
var
 PIDArray: array [0..1023] of DWORD;
 ModuleName: array [0..300] of char;
 cb: DWORD;
 i, ProcCount: integer;
 hMod: HMODULE;
 hProcess: THandle;
begin
 Info.Clear;
 EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);
 ProcCount:= cb div SizeOf(DWORD);
 for i := 0 to ProcCount-1 do
  begin
   hProcess:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PIDArray[i]);
   if (hProcess <> 0) then
    begin
     EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
     GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));
     Info.Lines.Add(ModuleName);
     CloseHandle(hProcess);
    end;
end;
 end;
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Flashton (17.10.2013)
  #3  
Старый 17.10.2013, 10:05
Flashton Flashton вне форума
Прохожий
 
Регистрация: 11.05.2010
Сообщения: 8
Репутация: 10
По умолчанию

Спасибо, сегодня попробую этот код в XE2. Меня просто спросили почему так, я после этого и сам задумался, почему XE2 так "криво" работает с этой функцией, если в 7 delphi всё нормально?

Спасибо. Меня просто спросили почему так, я после этого и сам задумался, почему XE2 так "криво" работает с этой функцией?

Последний раз редактировалось M.A.D.M.A.N., 17.10.2013 в 13:03.
Ответить с цитированием
  #4  
Старый 20.10.2013, 15:43
Flashton Flashton вне форума
Прохожий
 
Регистрация: 11.05.2010
Сообщения: 8
Репутация: 10
По умолчанию

Спасибо всем ответившим
Разобрался: проблема в том, что я не инициализировал размер структуры, нужно было добавить код PPE.dwSize:=sizeof(PPE);
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:03.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter