Определение объёма видеопамяти.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Frairs
Сообщения: 19
Зарегистрирован: 25 фев 2013, 20:04

Всем привет. Пытался определить объём видеопамяти с помощью 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 тоже не получилось.

Может кто нибудь знает альтернативный способ достоверное вывести объём общей видеопамяти на консоль? Или может подскажете функцию которая возвращала бы мне ветку реестра, что бы я из неё мог вытащить всё. Ну я больше не знаю вариантов...
Wound
Сообщения: 1
Зарегистрирован: 17 май 2013, 22:00

Судя по всему это либо сложно, либо бессмыслено.

Гугл выдает такие варианты:

Через 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;
}
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Ну как бы для таких данных создан WMI
Просто посмотрите на параметр AdapterRAM сервиса Win32_VideoController. Значение там в байтах. Как работать с WMI можно найти без труда.
It's a long way to the top if you wanna rock'n'roll
Ответить