![]() |
Определение количества RAM и количества видеопамяти
Встала проблема в определении количества оперативки и памяти видеокарты.
Код ест, однако он не совсем верно пашет Код:
function raminfo:PChar; Код:
// РАМ на видюхе 2 Память видеокарты фиксировано выдает 256 Мб на любой конфигурации. Знаю что prokazzza, и Mr dUSHA как то сделали такое в WinStyle. Не знаю что делать, почти месяц стою на этой проблеме... |
stasmd, правильно, до двух гигх, как и сказано в документации. Исключения, если программа скомпилирована с ключом /LARGEADDRESSAWARE (для Сишного компилятора Микрософт), тогда и с этой потянет. Для большего нужно воспользоваться функцией GlobalMemoryStatusEx, да и вовсе, не Ex функция устарела.
Кстати MemInfo.dwLength:=SizeOf(MemInfo); означает элементу dwLength структуры MemInfo присвоить размер типа переменной MemInfo, что по сути SizeOf(TMemoryStatus). Если конечно комментарий в коде не относиться глобально к участку кода, а к данной строке. Насчёт видео, то данная функция (EnumDisplayDevices) не предназначена для получения количества видеопамяти. К тому же параметр DeviceString, структуры TDisplayDevice (DISPLAY_DEVICE), несёт имя устройства вывода... |
Цитата:
Код:
MemInfo.dwLength:=SizeOf(MemInfo); Насчет памяти, дал не тот код :) Вот нужный, но он не работает как следует Код:
// РАМ на видюхе 2 |
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 и означает Код:
DISPLAY_DEVICE_ACTIVE |
Admiral, код брал на Делфи Кингдом, сам я не особо врубился в его значение.
Насчет видео, то ясно чего не не выдавал :) Константа подбиралась под количество рам на моей видяхе (но как оказалось бестолку) Далее с оперативкой, функция GlobalMemoryStatusEx не пашет, нету ее на делфи :( Путался методом копипаста добаить, но бестолку Код:
[Error] KMSI.dpr(33): Undeclared identifier: 'GlobalMemoryStatusEx' Код:
function TotalPhysicalMemory: Int64; |
stasmd, увы, по вопросу непосредственно кода Делфи подсказать не смогу, предыдущее рекомендации говорил, проводя аналогию с Си.
Вот есть тема на codegear по данной функции Problem with GlobalMemoryStatusEx() Предлагают описать функцию самостоятельно, в системе то она есть. |
Admiral, тему видел, но все равно спасибо.
А насчет определения видеопамяти ничего подсказать не сможете? |
stasmd, сложно сказать, мне такая функция, в рамках WIN32, не известна, иначе бы обязательно дал знать.
Не исключаю, что в системе можно что-то поискать, и найти, к примеру, в реестре запись про видеопамять. А для актуального определения видеопамяти (в реестре данные могут устаревать/быть не точными), придётся связываться с графическими библиотеками. Но это зависит от приложения, если оно уже использует графическую библиотеку, то проблем быть не должно, и ответ ждёт в документации к последней. А для не использующих, не совсем ясно, зачем выявление этого значение вовсе нужно? Разве что для написания своего Эвереста, SiSoft Sandr'ы и подобного софта. P.S. Может быть если работать с API драйверов, например с функцией DrvGetDirectDrawInfo, можно узнать и количество видеопамяти. |
Admiral, с технологией КОМ не знаком :)
Собственно видеопамять можно считывать из реестра, но... Непонятно где она хранится, так как все что можно было я обыскал. Что интересно, как отписался в первом посте, Цитата:
Ну определение видеопамяти не столь критично для меня. Насчет оперативки, то функция GlobalMemoryStatusEx пашет не совсем корректно. Не выдает все нужное количество RAM |
Вот здесь 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 перед вызовом функции заданно? |
Admiral, насчет ключей реестр а знаю, уже думал над этим, но на разных компах {8A1E77B7-6F63-41CF-96DA-69F860EB4DDC}\0000 это значение разное.
Вот код для определения RAM (убил вчера часа 3 перепробовал массу вариантов и вариаций написания) Код:
// общий размер физической памяти |
stasmd
Цитата:
Цитата:
Но смысла в них нет, так как в HardwareInformation.MemorySize что-то не то. |
stasmd, Admiral, Извините что вмешиваюсь, мне когда-то Serega помогал инсталятор делать, в котором была проверка видеопамяти. Может это поможет чем-то? :dont-know Здесь идёт определение модели видеокарты, размера памяти и текущее разрешение.
Код:
// Видеокарта: |
Drongo, вроде чето есть. Проверю сайчас, спасибо.
Admiral, а что с кодом для оперативки делать? Скиньте свой для сравнения. PS Старый код без ЕХ прекрасно пашет на х64 :/ |
stasmd, у меня на Си
Код:
#include <windows.h> Инициализация MEMORYSTATUSEX Buffer = {0}; аналогична тому что далее будет вызвано ZeroMemmory, но в данном случаи главное заполнить dwLength перед вызовом GlobalMemoryStatusEx. |
Вопрос - где в реестре Windows хранится значение текущей оперативной памяти? И храниться ли?
|
Цитата:
|
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) |
Время: 11:11. |
Время: 11:11.
© OSzone.net 2001-