如何获得Windows 7中的所有电源scheme的名称在C + +?

我必须得到Windows 7中所有可用的电源scheme的名称。我尝试枚举他们的电源pipe理function,我得到正确的金额,但是当我打电话“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个定制的电源scheme,他们的名字检索总是失败。 标准的3个电源scheme(高性能,平衡,省电)一直工作。

所以我认为它必须做的自定义计划,我手动添加2更多。 但事实certificate,其中一个实际上是有效的,我可以得到它的名字(都来自平衡)。

然后我手动添加了另外2个自定义scheme(这次来自节电器),这一次似乎都起作用了。 我现在有9个,我可以得到其中6个的名字。 我无法得到2个原始定制电源scheme的名称(均来自均衡)以及我第一次添加的第二个。

当我在控制台中键入“powercfg -list”时,我可以得到所有电源scheme的列表,但是如何在c ++中可靠地获取所有电源scheme的名称,而无需redirect/parsing控制台,而使用Windows电源pipe理function?

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; } }