Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Список процессов


Страницы:   1 2

JB ©   (2005-05-19 11:11:00) 

Удалено модератором
Примечание: AutoModerator


Piter   (2005-05-26 23:32:00) [1]

GrayFace ©   (26.05.05 19:27) [22]
Как мне помнится, в каких-то Nt-шках не поддерживается ToolHelp32, но есть NtQuerry...


ну видимо во всех NT до Win2000


Игорь Шевченко   (2005-05-26 19:37:00) [2]

alpet ©   (20.05.05 20:18) [20]

Ейных функций во-первых мало, во-вторых, они все переадресуются к Kernel32, насколько я могу судить. Так что не советую.


GrayFace   (2005-05-26 19:27:00) [3]

Как мне помнится, в каких-то Nt-шках не поддерживается ToolHelp32, но есть NtQuerry...

alpet ©   (20.05.05 20:18) [20]
Скорее всего, при их вызове ничего не делается и возвращается ошибка "not supported".


Marser   (2005-05-21 12:13:00) [4]

Удалено модератором
Примечание: AutoModerator


alpet   (2005-05-20 20:18:00) [5]

Marser ©   (20.05.05 18:18) [18]
> Хотя бы потому, что в Win9x её нету.

Не много оффтоп. Я обнаружил что в составе Win98 всегда определяется библиотека ntdll.dll. Из нее вроде можно экспортировать-юзать функции (such as NtCreateFile) которые по описанию в MSDN для этой версии Windows заказаны. Она что редистрибутабельная эта либа ?


Piter   (2005-05-20 20:12:00) [6]

Marser ©   (20.05.05 18:18) [18]
Хотя бы потому, что в Win9x её нету


верно. Это еще одна причина. А другую причину уже и озвучить нельзя, ибо Marser рассмотрел в этом понты?!


Marser   (2005-05-20 18:18:00) [7]


> почему я узнаю нформацию о процессах с помощью
> снимков, а не с помощью этой функции

Хотя бы потому, что в Win9x её нету.


Piter   (2005-05-20 18:11:00) [8]

Marser ©   (20.05.05 16:29) [16]
о его недокументированности выглядит как красование своими знаниями


да? А почему бы вообще этот пример не рассматривать, как красование моими знаниями? Мол, решил покрасоваться - поэтому и написал этот ответ?

Про недокументированность я упомянул для того, чтобы объяснить почему я узнаю нформацию о процессах с помощью снимков, а не с помощью этой функции. Ведь логичнее получать информацию с помощью документированных функций, чем недокумнтированных?


Marser   (2005-05-20 16:29:00) [9]


> Нда? Понт? И в чем же здесь понт, Сергей? Объяснишь
> может?

Информация бесполезна, поскольку не содержит описания работы NtQuerySystemInformation. Упоминание о его недокументированности выглядит как красование своими знаниями.
В принципе, такое упоминание приемлемо. Но в полноценной статье, а не в FAQ.

В остальном оформление очень неплохое.


Игорь Шевченко   (2005-05-20 15:20:00) [10]

Piter ©   (20.05.05 15:16) [14]


> вроде когда я писал еще не была документирована


А когда ты писал ?


Piter   (2005-05-20 15:16:00) [11]

Удалено модератором
Примечание: AutoModerator


Marser   (2005-05-20 14:38:00) [12]

Удалено модератором
Примечание: AutoModerator


alpet   (2005-05-20 14:10:00) [13]

Модули для упрощения работы со списком процессов.
http://alpet.hotmail.ru/psmap.zip(7Кбайт)
Поддерживается также поиск по ID процесса, и имени его файла. Создание списка окон с получением их иконок, с созхранением резульатов в TListView компонент.


GrayFace   (2005-05-20 13:54:00) [14]

Piter ©   (19.05.05 18:01) [10]
пресловутую NtQuerySystemInformation, которая недокументированна.

Прекрасно документирована в MSDN, но с пометкой "is internal function".

Piter ©   (19.05.05 18:01) [10]
Файл проекта с данным примером можно загрузить ЗДЕСЬ

:)


Piter   (2005-05-19 18:01:00) [15]

Вопрос: как получить список процессов в системе

Ответ: будем пользоваться функцией CreateToolhelp32Snapshot, она реализована как в NT системах (начиная с windows 2000), так и в 9x. В NT она использует пресловутую NtQuerySystemInformation, которая недокументированна.
Заголовок CreateToolhelp32Snapshot и остальные типы описаны в модуле TlHelp32.
CreateToolhelp32Snapshot может делать снимок процессов и куч, модулей, потоков, используемых процессом. Она заносит требуемые данные в некоторую структуру (снимок) и возвращает ее описатель. После использования снимка нужно закрыть описатель.
Работать со снимком можно с помощью функций Process32First, Process32Next, Thread32First , Thread32Next и так далее (описаны в Win32 SDK в разделе 'Tool Help Functions'). Эти функции заносят информацию о конкретном процессе, потоке и т.д. из снимка в структуры типа TProcessEntry32, TThreadEntry32.
Итак, будем получать список процессов и заносить их названия в ListBox1, который лежит у нас на форме:

uses
TlHelp32;
...

procedure TForm1.Button1Click(Sender: TObject);
var
 HSnapShot: THandle;
 pe: TProcessEntry32;
begin
 listbox1.Clear; //очишаем наш ListBox1
 HSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //нам нужен снимок процессов
 pe.dwSize := sizeof(ProcessEntry32); //перед использованием TProcessEntry32 нужно заполнить поле dwSize
 if Process32First(HSnapShot, pe) then // если первая запись о процессах получена - продолжаем
  repeat
    listbox1.Items.Add(pe.szExeFile); // добавляем в ListBox
  until ( not Process32Next(HSnapShot,pe) ); // получаем запись о следующем процессе, если не получаем - выходим из цикла
 closehandle(HSnapShot); // закрываем описатель снимка
end;

Файл проекта с данным примером можно загрузить ЗДЕСЬ

Отвечал: Piter


Eraser   (2005-05-19 16:02:00) [16]

JB   (19.05.05 15:01) [6]

Во-первых Marser ©   (19.05.05 15:22) [8]

Во-вторых ты пропускаешь первый элимент

if Module32First(h,Module32) then
begin
 Repeat
  Next:=Module32Next(H,Module32);


Marser   (2005-05-19 15:22:00) [17]


> JB   (19.05.05 15:01) [6]

Ты всё перепутал. Тебе ведь процессы нужны, а не модули. А значит, используй соответственно process32first, process32next, структуру TProcessEntry32 и константу TH32CS_SNAPPROCESS.


Eraser   (2005-05-19 15:18:00) [18]

JB   (19.05.05 15:01) [6]
if Module32First(h,Module32) then
 begin
  Repeat
   Next:=Module32Next(H,Module32);


Не правильно!


JB   (2005-05-19 15:01:00) [19]

>Eraser
Код:
 
 Module32.dwSize:=SizeOf(TModuleEntry32);
 H:=CreateToolHelp32Snapshot(TH32CS_SNAPMODULE, 0);
 if Module32First(h,Module32) then
  begin
   Repeat
    Next:=Module32Next(H,Module32);

    if Next  Then
      {добавляем в список}
   Until Not Next;
  end;
  CloseHandle(h);


Digitman   (2005-05-19 14:24:00) [20]

Members

dwSize

Specifies the length, in bytes, of the structure. Before calling the Process32First function, set this member to
sizeof(PROCESSENTRY32).


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо