Как получить имена всех схем питания в Windows 7 в C ++?

Я должен получить имена всех доступных схем электропитания в Windows 7. Я пытаюсь перечислить их с помощью функций управления электропитанием, и я получаю правильное количество, но когда я вызываю «PowerReadFriendlyName» (http://msdn.microsoft.com/en-us/library/windows/desktop/aa372740%28v=vs.85%29.aspx) иногда работает и иногда не работает:

UCHAR   displayBuffer[256];
DWORD   displayBufferSize = sizeof(displayBuffer);
GUID    buffer;
DWORD   bufferSize = sizeof(buffer);
int     index;
int     fail=0,ok=0;
//
for(index = 0 ; ; index++)
{   ZeroMemory(&buffer, sizeof(buffer));
ZeroMemory(&displayBuffer, sizeof(displayBuffer));
if (PowerEnumerate(NULL,NULL,NULL, ACCESS_SCHEME,index,(UCHAR*)&buffer,&bufferSize) == ERROR_SUCCESS)
{   if (PowerReadFriendlyName(NULL, &buffer,&NO_SUBGROUP_GUID,NULL,displayBuffer,&displayBufferSize) == ERROR_SUCCESS)
{   ok++;
// stuff to todo
}
else
{   fail++;
// why?
}
}
else
{   break;
}
}

Сначала у меня было 2 пользовательских схемы питания, и поиск их имени всегда не удался. Стандартные 3 схемы питания (высокая производительность, сбалансированный, энергосбережение) всегда работали.

Поэтому я подумал, что это связано с пользовательскими схемами, и я вручную добавил еще 2 из них. Но, как оказалось, один из них на самом деле работает, и я могу получить его имя (оба были получены из сбалансированного).

Затем я вручную добавил еще две пользовательские схемы (на этот раз, полученные из режима энергосбережения), и на этот раз обе, похоже, работали. Теперь у меня их 9, и я могу получить имена 6 из них. Я не могу получить названия двух оригинальных пользовательских схем питания (обе взяты из сбалансированных), а также двух из тех, которые я добавил в первый раз.

Когда я набираю «powercfg -list» в консоли, я могу получить список всех схем электропитания, но как я могу надежно получить имена всех схем электропитания в c ++, не перенаправляя / анализируя консоль, а используя функции управления питанием Windows?

1

Решение

В документации функции PowerReadFriendlyName () не упоминается, что переменная, содержащая длину буфера, перезаписывается при успешном вызове с буфером, отличным от NULL. Поэтому он должен быть установлен перед каждым вызовом PowerReadFriendlyName (), иначе может произойти сбой:

UCHAR   displayBuffer[2048];
DWORD   displayBufferSize;
GUID    buffer;
DWORD   bufferSize = sizeof(buffer);
int     index;
int     fail=0,ok=0;
//
for(index = 0 ; ; index++)
{   ZeroMemory(&buffer, sizeof(buffer));
ZeroMemory(&displayBuffer, sizeof(displayBuffer));
if (PowerEnumerate(NULL,NULL,NULL, ACCESS_SCHEME,index,(UCHAR*)&buffer,&bufferSize) == ERROR_SUCCESS)
{   displayBufferSize = sizeof(displayBuffer);
if (PowerReadFriendlyName(NULL, &buffer,&NO_SUBGROUP_GUID,NULL,displayBuffer,&displayBufferSize) == ERROR_SUCCESS)
{   ok++;
// stuff to todo
}
else
{   fail++;
}
}
else
{   break;
}
}
2

Другие решения


По вопросам рекламы [email protected]