![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Список процессов
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).