страничка tripsin'а


Главная | Статьи | Заметки | Файлы| Ссылки | я
Назад

Дальше

Получение списка процессов. 4 часть. Реестр.

Скачай демонстрационный проект (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 г.

Hosted by uCoz