Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Определение количества RAM и количества видеопамяти

Ответить
Настройки темы
Delphi - Определение количества RAM и количества видеопамяти

Аватара для stasmd

Пользователь


Сообщения: 70
Благодарности: 9

Профиль | Отправить PM | Цитировать


Изменения
Автор: stasmd
Дата: 23-12-2009
Описание: Поправил код видюхи
Встала проблема в определении количества оперативки и памяти видеокарты.
Код ест, однако он не совсем верно пашет

Код: Выделить весь код
function raminfo:PChar;
var MemInfo:TMemoryStatus;
begin
  MemInfo.dwLength:=SizeOf(MemInfo);   // Определяет актуальную информацию о памяти
  GlobalMemoryStatus(MemInfo);
result:=PChar(IntToStr(MemInfo.dwTotalPhys div 1047500)+' Mb ');   // высчтывает ее
end;
и для видеокарты
Код: Выделить весь код
// РАМ на видюхе 2
function vidmeminfo2:PChar;
var
  lpDisplayDevice: TDisplayDevice;
  a:Real;
  b:string;
begin
lpDisplayDevice.cb := sizeof(lpDisplayDevice);
EnumDisplayDevices(nil, 0, lpDisplayDevice, 0);
a:=(lpDisplaydevice.StateFlags div 524280);
//a:=Round(Int(a));
b:=FloatToStr(a);
Result:=Pchar(b+' ');
end;
Функция памяти определяет нормально только до 2 Гб оперативки, все что более определяется не верно (обычно как 2047). На x64 не тестил, может там будет пахать.

Память видеокарты фиксировано выдает 256 Мб на любой конфигурации.


Знаю что prokazzza, и Mr dUSHA как то сделали такое в WinStyle. Не знаю что делать, почти месяц стою на этой проблеме...

Отправлено: 02:14, 23-12-2009

 

Аватара для stasmd

Пользователь


Сообщения: 70
Благодарности: 9

Профиль | Отправить PM | Цитировать


Admiral, насчет ключей реестр а знаю, уже думал над этим, но на разных компах {8A1E77B7-6F63-41CF-96DA-69F860EB4DDC}\0000 это значение разное.


Вот код для определения RAM (убил вчера часа 3 перепробовал массу вариантов и вариаций написания)

Код: Выделить весь код
// общий размер физической памяти
function raminfo: PChar;
var
   MemoryStatus: TMemoryStatusEx;
begin
//ZeroMemory(@MemoryStatus, SizeOf(TMemoryStatusEx));
MemoryStatus.dwLength := SizeOf(TMemoryStatusEx);
GlobalMemoryStatusEx(MemoryStatus);
Result :=PChar(IntToStr(MemoryStatus.ullTotalPhys div 5441471906132)+' Mb '); //не обращать внимания, пытался подстроить под себя
if Result<>' ' then
Result:=Result
else
Result:=PChar('Нет Данных');
end;

Отправлено: 17:18, 24-12-2009 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


stasmd
Цитата:
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\VIDEO
будет на всех ПК, а там в параметрах
Цитата:
указанны дальнейшие адреса по поиску
программно.
Но смысла в них нет, так как в HardwareInformation.MemorySize что-то не то.

Отправлено: 20:58, 25-12-2009 | #12


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


stasmd, Admiral, Извините что вмешиваюсь, мне когда-то Serega помогал инсталятор делать, в котором была проверка видеопамяти. Может это поможет чем-то? Здесь идёт определение модели видеокарты, размера памяти и текущее разрешение.
Код: Выделить весь код
// Видеокарта:
  VideoRAMPanel.Color := $CCFFCC

  lpDisplayDevice.cb := SizeOf(lpDisplayDevice)
  DeviceKey := ''
	n := 0
  while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
            (lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do n := n + 1
	for n := 0 to 127 do DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n]
  Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127)  // Ключ драйвера получаем из API
	StringChange(DeviceKey, '\Registry\Machine\', '')
  errCode := 1
  DeviceValue := 0
  if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceName) then
		 for n := 1 to Length(DeviceName) do
       begin
         DeviceValue := DeviceValue + Ord(DeviceName[n])*errCode
         errCode := errCode*$100
       end
  else
     if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
     else
        RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue)
	DeviceName := ''
  for n := 0 to 127 do DeviceName := DeviceName + lpDisplayDevice.DeviceString[n]
  Delete(DeviceName, Pos(Chr(0), DeviceName), 127)

  if DeviceName <> '' then
    if DeviceValue > 0 then
      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ', '+ ByteOrTB(DeviceValue/oneMB, False)
    else
      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ' (Standard), '+ ByteOrTB(DeviceValue/oneMB, False)
  else
     begin
      VideoRAMPanel.Text := ' Драйвер устройства не обнаружен'
      VideoRAMPanel.Color := $CCCCFF
      ChangeText := True
     end
  if (DeviceValue/oneMB < NeedVideoRAM) then
     begin
       VideoRAMPanel.Color := $CCCCFF
       ChangeText := True
     end
  VideoRAMPanel.Text := VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
                        IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
                        GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)'

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:36, 25-12-2009 | #13


Аватара для stasmd

Пользователь


Сообщения: 70
Благодарности: 9

Профиль | Отправить PM | Цитировать


Drongo, вроде чето есть. Проверю сайчас, спасибо.

Admiral, а что с кодом для оперативки делать? Скиньте свой для сравнения.

PS Старый код без ЕХ прекрасно пашет на х64 :/

Отправлено: 02:06, 26-12-2009 | #14


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


stasmd, у меня на Си
Код: Выделить весь код
#include <windows.h>
#include <stdio.h>

int wmain(int argc, wchar_t *argv[])
{
	MEMORYSTATUSEX Buffer = {0};	//Объявляем переменную Buffer структурного типа MEMORYSTATUSEX
	Buffer.dwLength = sizeof(MEMORYSTATUSEX);	//Присваиваем элементу dwLength размер структуры MEMORYSTATUSEX
	GlobalMemoryStatusEx(&Buffer);	//Вызываем функцию определяющую количество установленной на ПК памяти
	wprintf(L"\n%ld", Buffer.ullTotalPhys);		//результат отобразить в консоли
	return 0;	//заканчиваем работу программы
}
Если сравнивать с постом №11 и не брать во внимание строку с делением то код такой же.
Инициализация MEMORYSTATUSEX Buffer = {0}; аналогична тому что далее будет вызвано ZeroMemmory, но в данном случаи главное заполнить dwLength перед вызовом GlobalMemoryStatusEx.

Отправлено: 03:57, 26-12-2009 | #15


Аватара для stasmd

Пользователь


Сообщения: 70
Благодарности: 9

Профиль | Отправить PM | Цитировать


Вопрос - где в реестре Windows хранится значение текущей оперативной памяти? И храниться ли?

Отправлено: 23:21, 01-04-2010 | #16


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата stasmd:
И храниться ли? »
Думаю, что нет. Не хранится такое значение в реестре.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 14:19, 02-04-2010 | #17


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


stasmd HKEY_LOCAL_MACHINE\HARDWARE\RESOURCEMAP\System Resources\Physical Memory параметр .Translated
Хранится не в десятичной системе исчесления, а в неком REG_RESOURCE_LIST.
how to read REG_RESOURCE_LIST data from registry

На MS How to get the Physical Memory information using Registry рекомендуют всё же прислушатся к GlobalMemoryStatus(Ex)
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:35, 05-04-2010 | #18



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Определение количества RAM и количества видеопамяти

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - [решено] Определение частоты процессора, видеопамяти и др. Virtyaluk Программирование и базы данных 10 25-03-2010 22:53
Теория - Regexp-ы, определение количества совпадений hasherfrog Программирование и базы данных 2 02-04-2009 12:11
[решено] Подсчет количества папок BlaJes AutoIt 4 10-02-2009 21:37
Подсчет количества лицензий. Zergling Microsoft Windows NT/2000/2003 0 24-04-2007 14:57
Настройка количества пользователей в Win XP HE wwwSerg Сетевые технологии 4 12-05-2004 14:55




 
Переход