Назад |
Скачай демонстрационный проект (26,1 кб)
Выше были описаны основные и наиболее часто используемые способы. Дальше пойдут более специфичные. Кстати все они могут быть использованы для получения информации с удаленного компьютера.
Получение списка процессов из реестра с помощью функции RegQueryValueEx подробнейшим образом описано в моей статье “HKEY_PERFORMANCE_DATA – виртуальный реестр”. Поэтому тут ничего объяснять не буду, а приведу только откомментированный код функции. Объявления структур смотри в демонстрационном проекте.
function FillProcessesList(var slProcesses: TStringList): Boolean;
const
INCREMENTAL_SIZE = 32768; // Шаг увеличения буфера
var
PerfData: PPerfDataBlock; // Все полученные данные
PerfObj: PPerfObjectType; // Объект - Process
PIDCntr: PPerfCounterDefinition; // Сюда получим счетчик ID Process (pid)
PerfInst: PPerfInstanceDefinition;// Экземпляр объекта Process
PtrToCntr: PPerfCounterBlock; // Блок данных счетчиков для экземпляра
buflen: DWORD; // длина буфера
i: Integer; // счетчик цикла
process_name: String; // имя процесса
pData: PLargeInteger; // указатель на данные счетчика
begin
Result := False;
buflen := INCREMENTAL_SIZE;
GetMem(PerfData, buflen); // Резервируем буфер
try
// Получаем данные о процессах в буфер. Если буфер слишком мал,
// то увеличиваем его и снова пытаемся получить данные.
while RegQueryValueEx(HKEY_PERFORMANCE_DATA,
'230',// Индекс объекта - Process
nil,nil,Pointer(PerfData), @buflen)
= ERROR_MORE_DATA do
begin
inc(buflen,INCREMENTAL_SIZE);
ReallocMem(PerfData, buflen);
end;
RegCloseKey(HKEY_PERFORMANCE_DATA); // Обязательно надо закрыть
// Получаем объект с инфой о процессах
PerfObj := PPerfObjectType(DWORD(PerfData) + PerfData.HeaderLength);
// Получаем первый счетчик
PIDCntr := PPerfCounterDefinition(DWORD(PerfObj) +
PerfObj.HeaderLength);
// Пробегаемся по всем счетчикам. Ищем счетчик - ID Process (индекс=784)
for i := 0 to PerfObj.NumCounters - 1 do
begin
if PIDCntr.CounterNameTitleIndex = 784 then Break;
PIDCntr := PPerfCounterDefinition(DWORD(PIDCntr) +
PIDCntr.ByteLength);
end;
// Получаем первый экземпляр объекта (процесс)
PerfInst := PPerfInstanceDefinition(DWORD(PerfObj) +
PerfObj.DefinitionLength);
// Пробегаемся по всем экземплярам
for i := 0 to PerfObj.NumInstances - 1 do
begin
// Получаем имя процесса
process_name := WideCharToString(PWideChar(DWORD(PerfInst) +
PerfInst.NameOffset));
// Пропускаем экземпляр с общими данными
if process_name = '_Total' then Continue;
// Получаем указатель на блок данных счетчиков данного экземпляра
PtrToCntr := PPerfCounterBlock(DWORD(PerfInst) +
PerfInst.ByteLength);
// Получаем PID
pData := Pointer(DWORD(PtrToCntr) + PIDCntr.CounterOffset);
// Выводим данные
slProcesses.Add(process_name +
'; PID = ' + IntToStr(Integer(pData^)));
Result := True;
// Получаем следующий экземпляр. Он сразу за блоком данных счетчиков.
PerfInst := PPerfInstanceDefinition(DWORD(PtrToCntr) +
PtrToCntr.ByteLength);
end;
finally
FreeMem(PerfData); // Обязательно освобождаем память
end;
end;
Назад |
(с) tripsin aka Орехов Роман, 2006 г.