Немного расширим ответ cppanda:
Что касается видеокарт, то в системе иногда их больше одного.Лучший способ получить на них много информации - это использовать DirectX.
Если он предназначен для совместимости с Vista и более поздними версиями, вы можете использовать DXGI, который, на мой взгляд, чище и проще в использовании.
Прежде всего, вам нужно создать фабрику DXGI ...
IDXGIFactory* DXGIFactoryPtr = 0;
HRESULT RetVal = CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&DXGIFactoryPtr);
if (FAILED(RetVal)) {/*Error Checking*/;}
, а затем использовать ее для циклического прохождения через каждый адаптер ...
unsigned short I = 0;
IDXGIAdapter* AdapterPtr = 0;
std::vector<IDXGIAdapter*> Adapters;
while (DXGIFactoryPtr->EnumAdapters(I, &AdapterPtr) != DXGI_ERROR_NOT_FOUND)
{
Adapters.push_back(AdapterPtr);
++I;
}
Отсюда вы можете увидеть, поддерживается ли Direct3D 10:
if (Adapters[I]->CheckInterfaceSupport(__uuidof(ID3D10Device), 0) == S_OK)
{ /*D3D10 is supported for this device*/; }
Перечислять подключенные выходы [IE Moniters], что может быть полезно для проверки поддерживаемых разрешений и таких:
unsigned short J = 0;
IDXGIOutput* OutputPtr = 0;
std::vector<IDXGIOutput*> Outputs;
while (Adapter[I]->EnumOutputs(J, &OutputPtr) != DXGI_ERROR_NOT_FOUND)
{
Outputs.push_back(OutputPtr);
++J;
}
и получите описание:
DXGI_ADAPTER_DESC AdapterDescription;
Adapter[I]->GetDesc(&AdapterDescription);
AdapterDescription имеет поля Description
, VenderId
, DeviceId
, SubSysId
, Revision
, DedicatedVideoMemory
, DedicatedSystemMemory
, SharedSystemMemory
и AdapterLuid
.AdapterLuid
является системным уникальным идентификатором для карты, но все остальные должны быть очень очевидны с учетом названий.
Кроме того, он становится специфичным для поставщика.
Для DirectX 9, которая доступна для Windows 2000, немного отличается.Сначала вы должны создать основной объект Direct3D9:
IDirect3D9* D3D9 = Direct3DCreate9(D3D_SDK_VERSION);
if (D3D9 == 0)
{ /* Error checking*/; }
Затем получить количество адаптеров:
unsigned short AdapterCount = (unsigned short)D3D9->GetAdapterCount();
Затем выполнить цикл по ним, получив их идентификаторы:
D3DADAPTER_IDENTIFIER9* Identifiers = new D3DADAPTER_IDENTIFIER9[AdapterCount];
HRESULT RetVal = 0;
for (unsigned short I = 0; I < AdapterCount; ++I)
{
RetVal = D3D9->GetAdapterIdentifier(I, 0, &Identifiers[I]);
if (FAILED(RetVal))
{ /* Error checking*/; }
}
Опять же, большинство полей должны быть самоочевидными.WHQLLevel - это информация о том, когда и когда Microsoft проверила совместимость этого драйвера с Windows, и по большей части может быть безопасно проигнорирована.Используя тот же метод, что и выше, вы также можете получить возможности устройства, используя GetDeviceCaps, что даст вам больше информации.
Как сказала cppanda, вы можете использовать IDirect3DDevice9 :: GetAvailableTextureMem (), но для этого вам нужносоздать устройство, прежде чем запрашивать его.Ничто из вышеперечисленного не указывает на необходимость создания устройства перед его извлечением.
Надеюсь, это поможет ~
[Примечание: многое из этого было извлечено из DirectX SDK, так что их кодне мой.]