|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Определение количества RAM и количества видеопамяти |
|
|
Delphi - Определение количества RAM и количества видеопамяти
|
![]() Пользователь Сообщения: 70 |
Встала проблема в определении количества оперативки и памяти видеокарты.
Код ест, однако он не совсем верно пашет 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; Память видеокарты фиксировано выдает 256 Мб на любой конфигурации. Знаю что prokazzza, и Mr dUSHA как то сделали такое в WinStyle. Не знаю что делать, почти месяц стою на этой проблеме... |
|
Отправлено: 02:14, 23-12-2009 |
Ветеран Сообщения: 3320
|
Профиль | Отправить 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 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() Пользователь Сообщения: 70
|
Профиль | Отправить PM | Цитировать Цитата Admiral:
Насчет памяти, дал не тот код ![]() Вот нужный, но он не работает как следует // РАМ на видюхе 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
|
Профиль | Отправить PM | Цитировать stasmd да, так MemInfo.dwLength:=SizeOf(TMemoryStatus); будет более читабельно. Это же касается и приведённого кода для видео - lpDisplayDevice.cb := sizeof(TDisplayDevice);
Хоть основное внимание в предыдущем посте было уделено уточнению комментария, объясняющему данную строку в первом посте. Обновлённый код не меняет утверждение Цитата:
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 и означает |
|
Последний раз редактировалось Admiral, 23-12-2009 в 17:53. Отправлено: 17:32, 23-12-2009 | #4 |
![]() Пользователь Сообщения: 70
|
Профиль | Отправить PM | Цитировать Admiral, код брал на Делфи Кингдом, сам я не особо врубился в его значение.
Насчет видео, то ясно чего не не выдавал ![]() Константа подбиралась под количество рам на моей видяхе (но как оказалось бестолку) Далее с оперативкой, функция GlobalMemoryStatusEx не пашет, нету ее на делфи ![]() Путался методом копипаста добаить, но бестолку вот сам код переменные выше описаны, кидать сюда их не стал. |
|
Отправлено: 18:51, 23-12-2009 | #5 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать stasmd, увы, по вопросу непосредственно кода Делфи подсказать не смогу, предыдущее рекомендации говорил, проводя аналогию с Си.
Вот есть тема на codegear по данной функции Problem with GlobalMemoryStatusEx() Предлагают описать функцию самостоятельно, в системе то она есть. |
Отправлено: 18:57, 23-12-2009 | #6 |
![]() Пользователь Сообщения: 70
|
Профиль | Отправить PM | Цитировать Admiral, тему видел, но все равно спасибо.
А насчет определения видеопамяти ничего подсказать не сможете? |
Отправлено: 20:06, 23-12-2009 | #7 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать stasmd, сложно сказать, мне такая функция, в рамках WIN32, не известна, иначе бы обязательно дал знать.
Не исключаю, что в системе можно что-то поискать, и найти, к примеру, в реестре запись про видеопамять. А для актуального определения видеопамяти (в реестре данные могут устаревать/быть не точными), придётся связываться с графическими библиотеками. Но это зависит от приложения, если оно уже использует графическую библиотеку, то проблем быть не должно, и ответ ждёт в документации к последней. А для не использующих, не совсем ясно, зачем выявление этого значение вовсе нужно? Разве что для написания своего Эвереста, SiSoft Sandr'ы и подобного софта. P.S. Может быть если работать с API драйверов, например с функцией DrvGetDirectDrawInfo, можно узнать и количество видеопамяти. |
Отправлено: 22:28, 23-12-2009 | #8 |
![]() Пользователь Сообщения: 70
|
Профиль | Отправить PM | Цитировать Admiral, с технологией КОМ не знаком
![]() Собственно видеопамять можно считывать из реестра, но... Непонятно где она хранится, так как все что можно было я обыскал. Что интересно, как отписался в первом посте, Цитата:
Ну определение видеопамяти не столь критично для меня. Насчет оперативки, то функция GlobalMemoryStatusEx пашет не совсем корректно. Не выдает все нужное количество RAM |
|
Отправлено: 00:15, 24-12-2009 | #9 |
Ветеран Сообщения: 3320
|
Профиль | Отправить 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 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|