1) DirectX - use Direct3D7 interfaces for this
2) more general - use WMI. -- C++ version
3) another DirectX - use DXDiag...
again C++ version :roll:
Code:
IDxDiagProviderAutoPtr dxDiagProvider;
HRESULT hr = CoCreateInstance(CLSID_DxDiagProvider, 0,
CLSCTX_INPROC_SERVER, IID_IDxDiagProvider, (LPVOID*)&dxDiagProvider);
if (SUCCEEDED(hr))
{
DXDIAG_INIT_PARAMS dxDiagInitParam;
ZeroMemory(&dxDiagInitParam, sizeof(DXDIAG_INIT_PARAMS));
dxDiagInitParam.dwSize =
sizeof(DXDIAG_INIT_PARAMS);
dxDiagInitParam.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION;
dxDiagInitParam.bAllowWHQLChecks = FALSE;
dxDiagInitParam.pReserved = 0;
IDxDiagContainerAutoPtr dxDiagRoot;
hr = dxDiagProvider->Initialize(&dxDiagInitParam);
if (SUCCEEDED(hr))
{
hr = dxDiagProvider->GetRootContainer(&dxDiagRoot);
if (SUCCEEDED(hr))
{
// enumerate all display devices until we find the device
identified by mD3DAdapterIdentifier.DeviceIdentifier
IDxDiagContainerAutoPtr dxDispDevices;
hr = dxDiagRoot->GetChildContainer(L"DxDiag_DisplayDevices",
&dxDispDevices);
if (SUCCEEDED(hr))
{
DWORD numDevices = 0;
hr =
dxDispDevices->GetNumberOfChildContainers(&numDevices);
if (SUCCEEDED(hr))
{
for (Uint dev = 0; dev < numDevices; dev++)
{
WCHAR devName[256];
hr = dxDispDevices->EnumChildContainerNames(dev,
devName, 256);
if (SUCCEEDED(hr))
{
IDxDiagContainerAutoPtr dxDispDevice;
hr = dxDispDevices->GetChildContainer(devName,
&dxDispDevice);
if (SUCCEEDED(hr))
{
// get this device's GUID, and see if it is
equal to mD3DAdapterIdentifier.DeviceIdentifier
GUID devGUID;
memcpy(&devGUID, &__uuidof(0), sizeof(GUID));
VARIANT v;
VariantInit(&v);
hr =
dxDispDevice->GetProp(L"szDeviceIdentifier", &v);
if (SUCCEEDED(hr) && v.vt == VT_BSTR)
{
IIDFromString(v.bstrVal, &devGUID);
}
VariantClear(&v);
if (IsEqualGUID(devGUID,
mD3DAdapterIdentifier.DeviceIdentifier))
{
// parse the display adapter memory string
hr =
dxDispDevice->GetProp(L"szDisplayMemoryEnglish", &v);
if (SUCCEEDED(hr) && v.vt == VT_BSTR)
{
WCHAR* endPtr = 0;
double adapterRam = wcstod(v.bstrVal,
&endPtr);
if (endPtr != v.bstrVal)
{
mVideoMemorySize = long(adapterRam)
* 1024 * 1024;
}
}
VariantClear(&v);
break; // done enumerating devices
}
}
}
}
}
}
}
}
}
Bookmarks