Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > GetProcessMemoryInfo в Windows 7


Автор: Steel 23.12.2010, 12:28
Собственно была программка, показывающая список процессов и сколько каждый из них занимает памяти. Под WinXP и  Win2003 работала замечательно. Под Win7 стала показывать объем памяти, занимаемый процессом более, чем в 2 раза выше реального (того что показывает диспетчер задач). Память получал с помощью функции GetProcessMemoryInfo (поле WorkingSetSize, возвращаемой структуры). Пробовал сделать через NtQuerySystemInformation - та же история. Как же все-таки узнать объем памяти, занимаемый процессом в Win7?

Автор: CodeMonkey 23.12.2010, 20:58
Какая разрядность системы и процессов?

Автор: Steel 23.12.2010, 21:04
32 бита

Автор: Qu1nt 23.12.2010, 23:56
Код?!

Автор: Steel 24.12.2010, 00:22
Код

function GetProcessMem(PID: Integer): Double;
var
  PH  : Cardinal;
  pmc : PPROCESS_MEMORY_COUNTERS;
  cb  : Integer;
begin
  Result:=0;

  PH:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
  try
    cb := SizeOf(_PROCESS_MEMORY_COUNTERS);
    GetMem(pmc, cb);
    pmc^.cb := cb;

    if GetProcessMemoryInfo(PH, pmc, cb) then
      Result:=pmc^.WorkingSetSize;
  except
  end;
  CloseHandle(PH);
  FreeMem(pmc, cb);
end;


Автор: Steel 25.12.2010, 15:59
Неужели никто не знает? 

Автор: Keeper89 25.12.2010, 16:53
Я смотрел, смотрел, через WMI и так - пока не соображу :(

Автор: alexnef 26.12.2010, 16:00
Насколько я помню Double для чисел с плавающей точкой. Попробуй изменить тип возвращаемого значения функции на что-нибудь другое, может проблема в этом.

Автор: Keeper89 26.12.2010, 22:48
alexnef, ага и 5000 КБ возвращаемые функцией магически превратятся в 800 из диспетчера задач smile

Автор: Qu1nt 27.12.2010, 00:02
У меня работает.
Windows 7 x32, Delphi XE.

Автор: Keeper89 27.12.2010, 00:26
А вот в Windows 7 x32, Delphi 2010 почему-то нет.

Автор: Steel 27.12.2010, 01:04
Windows 7 x32, Delphi 2007. Не хочет работать. Замучался уже. 

Автор: Qu1nt 27.12.2010, 01:13
Возможно мы на разные данные смотрим? Я на "Рабочий набор", вы — на "Частный рабочий набор".
Выбрать необходимые столбцы можно через Вид->Выбрать столбцы.

Автор: Keeper89 27.12.2010, 01:42
Qu1nt, черт, ты прав =)

Код, кстати, можно упростить:
Код

uses psAPI;

{...}

function CurrentProcessMemory(PH: THandle): Cardinal;
var
  MemCounters: TProcessMemoryCounters;
begin
  MemCounters.cb := SizeOf(MemCounters);
  if GetProcessMemoryInfo(PH,
      @MemCounters,
      SizeOf(MemCounters)) then
    Result := MemCounters.WorkingSetSize
  else
    RaiseLastOSError;
end;


Автор: Steel 27.12.2010, 10:35
Ёёёёёёёёёёёёёёмае! Спасибо!

Автор: Isaev 19.11.2018, 16:32
Цитата(Qu1nt @  27.12.2010,  01:13 Найти цитируемый пост)
Возможно мы на разные данные смотрим? Я на "Рабочий набор", вы — на "Частный рабочий набор".

А если нужна именно вторая цифра? Первая считывается правильно с помощью GetProcessMemoryInfo

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)