Можно извлечь эту информацию из массива, возвращенного debug_backtrace
В Windows вы можете использовать GetDeviceCaps
с флагом BITSPIXEL
, но сначала вам понадобится экранный DC ( GetDC
может принесите вам один).
HDC dc = GetDC(NULL);
int bitsPerPixel = GetDeviceCaps(dc, BITSPIXEL);
ReleaseDC(NULL, dc);
Это можно сделать с помощью WMI.
int bitDepth = -1;
hr = CoInitializeEx( NULL, COINIT_MULTITHREADED );
if ( SUCCEEDED( hr ) )
{
// hr = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL );
if ( SUCCEEDED( hr ) )
{
IWbemLocator* pLoc = NULL;
hr = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void**)&pLoc );
if ( SUCCEEDED( hr ) )
{
IWbemServices* pSvc = NULL;
hr = pLoc->ConnectServer( BSTR( L"ROOT\\CIMV2" ), NULL, NULL, 0, NULL, 0, 0, &pSvc );
if ( SUCCEEDED( hr ) )
{
hr = CoSetProxyBlanket( pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE );
if ( SUCCEEDED( hr ) )
{
IEnumWbemClassObject* pEnumerator = NULL;
hr = pSvc->ExecQuery( L"WQL", L"SELECT * FROM Win32_DisplayConfiguration", WBEM_FLAG_FORWARD_ONLY/* | WBEM_FLAG_RETURN_IMMEDIATELY*/, NULL, &pEnumerator );
if ( SUCCEEDED( hr ) )
{
IWbemClassObject* pDisplayObject = NULL;
ULONG numReturned = 0;
hr = pEnumerator->Next( WBEM_INFINITE, 1, &pDisplayObject, &numReturned );
if ( numReturned != 0 )
{
VARIANT vtProp;
pDisplayObject->Get( L"BitsPerPel", 0, &vtProp, 0, 0 );
bitDepth = vtProp.uintVal;
}
}
pEnumerator->Release();
}
}
pSvc->Release();
}
pLoc->Release();
}
}
// bitDepth wshould now contain the bitDepth or -1 if it failed for some reason.
Вы должны иметь возможность получить значение бит на пиксель, используя
HDC hdc = GetDC(NULL);
int colour_depth = GetDeviceCaps(hdc,BITSPIXEL);
ReleaseDC(NULL,hdc);
Поможет ли внедрение зависимостей в вашей ситуации? Это может избавить от всех глобальных переменных и позволить легко заменять зависимости в ваших модульных тестах.
Каждой основной функции потока передается карта, содержащая зависимости (драйверы, почтовые ящики и т. Д.), И они сохраняются в классах, которые будут использовать их (вместо доступа к какой-то глобальной переменной).
Для каждой среды (цель, симулятор, модульный тест ...) вы создаете одну функцию «конфигурации», которая создает все необходимые объекты, драйверы и все потоки, предоставляя потокам их список зависимости. Например, целевая конфигурация может создать драйвер USB и внедрить его в некоторый поток связи, в то время как конфигурация модульного теста связи может создать заглушку драйвера USB, которую контролируют тесты.
Если вам абсолютно необходима эта «прозрачность»