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

Аватара пользователя
stasmd

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

Сообщение stasmd »

Встала проблема в определении количества оперативки и памяти видеокарты.

Код ест, однако он не совсем верно пашет





Код:

Код: Выделить всё

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. Не знаю что делать, почти месяц стою на этой проблеме...
Аватара пользователя
Admiral

Re: Delphi - Определение количества RAM и количества видеопамяти

Сообщение Admiral »

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



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

Если конечно комментарий в коде не относиться глобально к участку кода, а к данной строке.



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

Re: Delphi - Определение количества RAM и количества видеопамяти

Сообщение stasmd »

Цитата Admiral:



SizeOf(TMemoryStatus)
Delphi - Определение количества RAM и количества видеопамяти




Не совсем с этим понятно. То есть это замена

Код:

Код: Выделить всё

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

Re: Delphi - Определение количества RAM и количества видеопамяти

Сообщение stasmd »

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

Re: Delphi - Определение количества RAM и количества видеопамяти

Сообщение Admiral »

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
Аватара пользователя
stasmd

Re: Delphi - Определение количества RAM и количества видеопамяти

Сообщение stasmd »

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;

переменные выше описаны, кидать сюда их не стал.
Аватара пользователя
Admiral

Re: Delphi - Определение количества RAM и количества видеопамяти

Сообщение Admiral »

stasmd, увы, по вопросу непосредственно кода Делфи подсказать не смогу, предыдущее рекомендации говорил, проводя аналогию с Си.

Вот есть тема на codegear по данной функции

Problem with GlobalMemoryStatusEx()


Предлагают описать функцию самостоятельно, в системе то она есть.
Аватара пользователя
stasmd

Re: Delphi - Определение количества RAM и количества видеопамяти

Сообщение stasmd »

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



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

Re: Delphi - Определение количества RAM и количества видеопамяти

Сообщение stasmd »

stasmd, сложно сказать, мне такая функция, в рамках WIN32, не известна, иначе бы обязательно дал знать.

Не исключаю, что в системе можно что-то поискать, и найти, к примеру, в реестре запись про

видеопамять. А для актуального определения видеопамяти (в реестре данные могут устаревать/быть не точными), придётся связываться с графическими библиотеками.


Например с DirectX


(и с тамтешней технологией COM\COM+)

В комплекте DxSDK есть одноимённый пример Samples\C++\Misc\VideoMemory

В примере приводится определения доступной видео памяти. Наиболее точное значение (адекватной свободной) вернул GetVideoMemoryViaDirectDraw (это не название функции, а сообщения в консоли при выполнении программы из этого примера)

GetVideoMemoryViaD3D9 не понятно как считает, вернул число больше чем физически видеопамяти в системе. Вероятно как-то учитывает и ОЗУ. Остальные вообще вернули n/a






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

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



P.S.

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

Re: Delphi - Определение количества RAM и количества видеопамяти

Сообщение stasmd »

Admiral, с технологией КОМ не знаком Изображение

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



Что интересно, как отписался в первом посте,
Цитата:



Знаю что prokazzza, и Mr dUSHA как то сделали такое в WinStyle



У них видеопамять определяется.



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





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

Не выдает все нужное количество RAM
Ответить

Вернуться в «Программирование и базы данных»