Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум 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

 

Ветеран


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

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


stasmd, правильно, до двух гигх, как и сказано в документации. Исключения, если программа скомпилирована с ключом /LARGEADDRESSAWARE (для Сишного компилятора Микрософт), тогда и с этой потянет. Для большего нужно воспользоваться функцией GlobalMemoryStatusEx, да и вовсе, не Ex функция устарела.

Кстати MemInfo.dwLength:=SizeOf(MemInfo); означает элементу dwLength структуры MemInfo присвоить размер типа переменной MemInfo, что по сути SizeOf(TMemoryStatus).
Если конечно комментарий в коде не относиться глобально к участку кода, а к данной строке.

Насчёт видео, то данная функция (EnumDisplayDevices) не предназначена для получения количества видеопамяти. К тому же параметр DeviceString, структуры TDisplayDevice (DISPLAY_DEVICE), несёт имя устройства вывода...

Последний раз редактировалось Admiral, 23-12-2009 в 03:00.

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

Отправлено: 02:22, 23-12-2009 | #2



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

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


Аватара для stasmd

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


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

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


Цитата Admiral:
SizeOf(TMemoryStatus) »
Не совсем с этим понятно. То есть это замена
Код: Выделить весь код
MemInfo.dwLength:=SizeOf(MemInfo);
как я понял.


Насчет памяти, дал не тот код
Вот нужный, но он не работает как следует
Код: Выделить весь код
// РАМ на видюхе 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;

Последний раз редактировалось stasmd, 23-12-2009 в 17:12.


Отправлено: 03:33, 23-12-2009 | #3


Ветеран


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

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


stasmd да, так MemInfo.dwLength:=SizeOf(TMemoryStatus); будет более читабельно. Это же касается и приведённого кода для видео - lpDisplayDevice.cb := sizeof(TDisplayDevice);
Хоть основное внимание в предыдущем посте было уделено уточнению комментария, объясняющему данную строку в первом посте.

Обновлённый код не меняет утверждение
Цитата:
функция (EnumDisplayDevices) не предназначена для получения количества видеопамяти
Что за константа 524280?
1024*1024 = 1048576 (это если константа выше призвана переводить из байтов в МБ, то откуда она именно такая?)
StateFlags - означает, как это ни банально, статус устройства вывода и может быть комбинацией значений
DISPLAY_DEVICE_ACTIVE\DISPLAY_DEVICE_MIRRORING_DRIVER\DISPLAY_DEVICE_MODESPRUNED\DISPLAY_DEVICE_PRIM ARY_DEVICE\DISPLAY_DEVICE_REMOVABLE\DISPLAY_DEVICE_VGA_COMPATIBLE
DISPLAY_DEVICE Structure
В данном случаи в StateFlags - 256*524280 = 134215680. Но так как 524280 не делит истинное значение без остатка, на самом деле StateFlags содержит 134217733 и означает
Код: Выделить весь код
DISPLAY_DEVICE_ACTIVE
DISPLAY_DEVICE_MODESPRUNED
DISPLAY_DEVICE_PRIMARY_DEVICE

Последний раз редактировалось Admiral, 23-12-2009 в 17:53.


Отправлено: 17:32, 23-12-2009 | #4


Аватара для stasmd

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


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

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


Admiral, код брал на Делфи Кингдом, сам я не особо врубился в его значение.
Насчет видео, то ясно чего не не выдавал

Константа подбиралась под количество рам на моей видяхе (но как оказалось бестолку)


Далее с оперативкой, функция GlobalMemoryStatusEx не пашет, нету ее на делфи
Путался методом копипаста добаить, но бестолку
Код: Выделить весь код
[Error] KMSI.dpr(33): Undeclared identifier: 'GlobalMemoryStatusEx'
вот сам код
Код: Выделить весь код
function TotalPhysicalMemory: Int64;
var
   MemoryStatus: TMEMORYSTATUSEX;
begin
     MemoryStatus.dwLength := SizeOf(MemoryStatus);
     if GlobalMemoryStatusEx(MemoryStatus) then
      Result := MemoryStatus.ullTotalPhys
     else
      Result := 0;
end;
переменные выше описаны, кидать сюда их не стал.

Отправлено: 18:51, 23-12-2009 | #5


Ветеран


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

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


stasmd, увы, по вопросу непосредственно кода Делфи подсказать не смогу, предыдущее рекомендации говорил, проводя аналогию с Си.
Вот есть тема на codegear по данной функции
Problem with GlobalMemoryStatusEx()
Предлагают описать функцию самостоятельно, в системе то она есть.

Отправлено: 18:57, 23-12-2009 | #6


Аватара для stasmd

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


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

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


Admiral, тему видел, но все равно спасибо.

А насчет определения видеопамяти ничего подсказать не сможете?

Отправлено: 20:06, 23-12-2009 | #7


Ветеран


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

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


stasmd, сложно сказать, мне такая функция, в рамках WIN32, не известна, иначе бы обязательно дал знать.
Не исключаю, что в системе можно что-то поискать, и найти, к примеру, в реестре запись про
видеопамять. А для актуального определения видеопамяти (в реестре данные могут устаревать/быть не точными), придётся связываться с графическими библиотеками.
Например с DirectX
(и с тамтешней технологией COM\COM+)
В комплекте DxSDK есть одноимённый пример Samples\C++\Misc\VideoMemory
В примере приводится определения доступной видео памяти. Наиболее точное значение (адекватной свободной) вернул GetVideoMemoryViaDirectDraw (это не название функции, а сообщения в консоли при выполнении программы из этого примера)
GetVideoMemoryViaD3D9 не понятно как считает, вернул число больше чем физически видеопамяти в системе. Вероятно как-то учитывает и ОЗУ. Остальные вообще вернули n/a


Но это зависит от приложения, если оно уже использует графическую библиотеку, то проблем быть не должно, и ответ ждёт в документации к последней.
А для не использующих, не совсем ясно, зачем выявление этого значение вовсе нужно? Разве что для написания своего Эвереста, SiSoft Sandr и подобного софта.

P.S.
Может быть если работать с API драйверов, например с функцией DrvGetDirectDrawInfo, можно узнать и количество видеопамяти.

Отправлено: 22:28, 23-12-2009 | #8


Аватара для stasmd

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


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

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


Admiral, с технологией КОМ не знаком
Собственно видеопамять можно считывать из реестра, но... Непонятно где она хранится, так как все что можно было я обыскал.

Что интересно, как отписался в первом посте,
Цитата:
Знаю что prokazzza, и Mr dUSHA как то сделали такое в WinStyle
У них видеопамять определяется.

Ну определение видеопамяти не столь критично для меня.


Насчет оперативки, то функция GlobalMemoryStatusEx пашет не совсем корректно.
Не выдает все нужное количество RAM

Отправлено: 00:15, 24-12-2009 | #9


Ветеран


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

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


Вот здесь HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\VIDEO перечислены устройства вывода, указанны дальнейшие адреса по поиску.
У меня для \Device\Video0 указанно
\Registry\Machine\System\CurrentControlSet\Control\Video\{8A1E77B7-6F63-41CF-96DA-69F860EB4DDC}\0000
Это естественно означает HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\{8A1E77B7-6F63-41CF-96DA-69F860EB4DDC}\0000
Там есть ключ HardwareInformation.MemorySize, значение правда там какое-то левое, и ничего общего с реальностью не имеет.


GlobalMemoryStatusEx проверил на ПК с 512 МБ, всё определилось правильно. Значение в dwLength перед вызовом функции заданно?

Отправлено: 00:51, 24-12-2009 | #10



Компьютерный форум 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




 
Переход