Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Программная инженерия > Безопасность, Шифрование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2007, 17:29   #1
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию Память процессов

Необходимо получить для всех процессов объёмы памяти: фиксированной, свободной и перемещаемой.

Код:

procedure FreeMemoryHeapCount(ProcessID,HeapID:DWORD; var fixed,free,moveable:DWORD);
var entry:THeapEntry32;
begin
  fixed:=0;
  free:=0;
  moveable:=0;
  entry.dwSize:=sizeof(entry);
  if Heap32First(entry,ProcessID,HeapID) then
  begin
    if entry.dwFlags=LF32_FIXED then
      fixed:=fixed+entry.dwBlockSize;
    if entry.dwFlags=LF32_FREE then
      free:=free+entry.dwBlockSize;
    if entry.dwFlags=LF32_MOVEABLE then
      moveable:=moveable+entry.dwBlockSize;
    entry.dwSize:=sizeof(entry);
    while Heap32Next(entry) do
    begin
      if entry.dwFlags=LF32_FIXED then
        fixed:=fixed+entry.dwBlockSize;
      if entry.dwFlags=LF32_FREE then
        free:=free+entry.dwBlockSize;
      if entry.dwFlags=LF32_MOVEABLE then
        moveable:=moveable+entry.dwBlockSize;
      entry.dwSize:=sizeof(entry);
    end
  end
end;

procedure FreeMemoryCount(snap:THandle; ID:DWORD; var fixed_mem,free_mem,moveable_mem:DWORD);
var fixed,free,moveable:DWORD;
    entry:THeapList32;
begin
  fixed_mem:=0;
  free_mem:=0;
  moveable_mem:=0;
  entry.dwSize:=sizeof(entry);
  if Heap32ListFirst(snap,entry) then
  begin
    if entry.th32ProcessID=ID then
    begin
      FreeMemoryHeapCount(ID,entry.th32HeapID,fixed,free,moveable);
      fixed_mem:=fixed_mem+fixed;
      free_mem:=free_mem+free;
      moveable_mem:=moveable_mem+moveable
    end;
    entry.dwSize:=sizeof(entry);
    while Heap32ListNext(snap,entry) do
    begin
      if entry.th32ProcessID=ID then
      begin
        FreeMemoryHeapCount(ID,entry.th32HeapID,fixed,free,moveable);
        fixed_mem:=fixed_mem+fixed;
        free_mem:=free_mem+free;
        moveable_mem:=moveable_mem+moveable
      end;
      entry.dwSize:=sizeof(entry)
    end
  end
end;

procedure TForm1.Button1Click(Sender: TObject);
var snap:THandle;
    entry:TProcessEntry32;
    fixed,free,moveable:DWORD;
begin
  snap:=CreateToolHelp32SnapShot(TH32CS_SNAPALL,0);
  entry.dwSize:=sizeof(entry);
  if Process32First(snap,entry) then
  begin
    FreeMemoryCount(snap,entry.th32ProcessID,fixed,free,moveable);
    StringGrid1.Cells[0,StringGrid1.RowCount-1]:=string(entry.szExeFile);
    StringGrid1.Cells[1,StringGrid1.RowCount-1]:=IntToStr(fixed);
    StringGrid1.Cells[2,StringGrid1.RowCount-1]:=IntToStr(free);
    StringGrid1.Cells[3,StringGrid1.RowCount-1]:=IntToStr(moveable);
    StringGrid1.RowCount:=StringGrid1.RowCount+1;
    entry.dwSize:=sizeof(entry);
    while Process32Next(snap,entry) do
    begin
      FreeMemoryCount(snap,entry.th32ProcessID,fixed,free,moveable);
      StringGrid1.Cells[0,StringGrid1.RowCount-1]:=string(entry.szExeFile);
      StringGrid1.Cells[1,StringGrid1.RowCount-1]:=IntToStr(fixed);
      StringGrid1.Cells[2,StringGrid1.RowCount-1]:=IntToStr(free);
      StringGrid1.Cells[3,StringGrid1.RowCount-1]:=IntToStr(moveable);
      StringGrid1.RowCount:=StringGrid1.RowCount+1;
      entry.dwSize:=sizeof(entry)
    end;
    CloseHandle(snap)
  end;
end;
Только вот программа выводит объём памяти текущего процесса. А как с остальными?
Carbon вне форума Ответить с цитированием
Старый 26.04.2007, 20:23   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

по определению он должен выводить память всех процессов
rpy3uH вне форума Ответить с цитированием
Старый 05.05.2007, 23:59   #3
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Разобрался. Нужно сделать снимок всех процессов с параметром 0, затем пройтись по процессам и сделать снимки куч с параметрами ID процесса (это я заменял на снимок с параметром 0, отсюда и кучи только для текущего процесса). Затем в каждом таком снимке нужно пройтись по спискам куч. В каждом таком списке пройтись по всем блокам и сложить их размеры. Только и всего!
Carbon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить список процессов? SoLL Win Api 19 28.01.2012 09:52
Блокировка процессов Zeraim Операционные системы общие вопросы 5 17.04.2008 13:02
отключение процессов UROKSAN Win Api 1 10.04.2008 09:08
Скрыть приложение из процессов... lamonana Общие вопросы Delphi 3 09.03.2008 23:23