我必须在Windows 7中获取所有可用电源方案的名称。我尝试使用电源管理功能枚举它们,但我确实得到了正确的数量但是当我打电话给#34; 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个的名字。我无法得到2个原始自定义电源方案的名称(均来自平衡)以及我第一次添加的第2个。
当我输入" powercfg -list"在控制台中,我可以获得所有电源方案的列表,但是如何在不重定向/解析控制台但使用Windows电源管理功能的情况下,在c ++中可靠地获取所有电源方案的名称?
答案 0 :(得分:2)
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;
}
}