Страница 1 из 1
Определение объёма видеопамяти.
Добавлено: 17 май 2013, 18:35
Frairs
Всем привет. Пытался определить объём видеопамяти с помощью WinAPI. Код получился такой:
Код: Выделить всё
DISPLAY_DEVICE DisplayDevice;
DisplayDevice.cb = sizeof(DisplayDevice);
EnumDisplayDevices(NULL, DispNum, &DisplayDevice, dwFlags);
cout << "Видео адаптер: "<< DisplayDevice.StateFlags << endl;
Но в этом случае он выводит не правильную информацию. Скорей всего он просто обращается к встроенной видеокарте. Или это я не правильно делаю. Хотя сколько лазил на форумах, у всех такие же варианты. И то что он выводит в байтах, а не в гигабайтах, это я знаю) Попробовал вытащить из реестра. У меня получилось, только тут возникла большая проблема, ветки реестра у разных производителей видеокарточек отличаются. Тут не предугадаешь. Кому интересно "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video" можете глянуть. Я не знаю как достоверное вывести видеопамять. С помощью Directx STD тоже не получилось.
Может кто нибудь знает альтернативный способ достоверное вывести объём общей видеопамяти на консоль? Или может подскажете функцию которая возвращала бы мне ветку реестра, что бы я из неё мог вытащить всё. Ну я больше не знаю вариантов...
Re: Определение объёма видеопамяти.
Добавлено: 17 май 2013, 22:36
Wound
Судя по всему это либо сложно, либо бессмыслено.
Гугл выдает такие варианты:
Через DirectX 9:
http://msdn.microsoft.com/en-us/library ... s.85).aspx
Вот еще нарыл код тестовой проги, автор утверждает что работать должен верно, я сам не проверял:
Код: Выделить всё
#include <stdio.h>
#include <tchar.h>
#define _WIN32_DCOM 1
#include <windows.h>
#include <wbemidl.h>
#include <comutil.h>
#pragma comment(linker, "/defaultlib:comsuppw.lib")
#pragma comment(linker, "/defaultlib:wbemuuid.lib")
int _tmain(int argc, _TCHAR* argv[])
{
IWbemLocator* locator = NULL;
CoInitialize(NULL);
HRESULT hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void**)&locator);
if( FAILED(hr) )
{
printf("Couldn't create locator.\n");
return 1;
}
IWbemServices* services = NULL;
hr = locator->ConnectServer(_bstr_t("root\\cimv2"), NULL, NULL, NULL, 0, NULL, NULL, &services);
locator->Release();
if( FAILED(hr) )
{
printf("Couldn't connect.\n");
return 2;
}
hr = CoSetProxyBlanket(services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
if( FAILED(hr) )
{
services->Release();
printf("Could not set security.\n");
return 3;
}
IEnumWbemClassObject* instanceEnum = NULL;
hr = services->CreateInstanceEnum(_bstr_t("Win32_VideoController"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &instanceEnum);
services->Release();
if( FAILED(hr) )
{
printf("Couldn't create enumerator.\n");
return 3;
}
IWbemClassObject* instance;
ULONG objectsReturned = 0;
while( 1 )
{
hr = instanceEnum->Next(WBEM_INFINITE, 1, &instance, &objectsReturned);
if( FAILED(hr) )
{
instanceEnum->Release();
printf("Enum->Next() failed.\n");
return 4;
}
if( objectsReturned != 1 )
break;
VARIANT v;
VariantInit(&v);
hr = instance->Get(_bstr_t("AdapterRAM"), 0, &v, NULL, NULL);
if( FAILED(hr) )
{
printf("Could not retrieve \"AdapterRAM\" property.\n");
}
else
{
printf("AdapterRAM = %d\n", V_UI4(&v)/(1024*1024));
}
VariantClear(&v);
instance->Release();
instance = NULL;
}
instanceEnum->Release();
printf("Completed Successfully.\n");
CoUninitialize();
Sleep(5000);
return 0;
}
Re: Определение объёма видеопамяти.
Добавлено: 17 май 2013, 23:44
somewhere
Ну как бы для таких данных создан WMI
Просто посмотрите на параметр AdapterRAM сервиса Win32_VideoController. Значение там в байтах. Как работать с WMI можно найти без труда.