Я должен получить имена всех доступных схем электропитания в 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?
В документации функции 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;
}
}