尝试更改ActivePowerScheme:RegOpenKeyEx失败,错误为0

时间:2011-10-04 09:07:27

标签: c++ winapi windows-7 registry

我需要通过在注册表项HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Power \ User \ PowerSchemes中更改它来设置ActivePowerScheme。 所以我尝试用winapi函数RegOpenKeyEx和RegSetValueEx

来做
wchar_t *PowerScheme=TEXT("8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c");
HKEY hRootKey = HKEY_LOCAL_MACHINE;
PWCHAR sKey = TEXT("SYSTEM\\CurrentControlSet\\Control\\Power\\User\\PowerSchemes");
PWCHAR sActivePowerS = TEXT("ActivePowerScheme"); 
HKEY hKeyResult = NULL; 
//open  
if (RegOpenKeyEx(hRootKey,sKey,0,KEY_ALL_ACCESS,&hKeyResult)!=ERROR_SUCCESS) {
      //it is always failing with error 0 !
      DWORD dw = GetLastError();  
}

但RegOpenKeyEx()始终失败,错误为0,表示“操作已成功完成”。并且RegSetValueEx()返回相同的值。

if(RegSetValueEx(hKeyResult,sActivePowerS,0,REG_SZ,
         (BYTE *)PowerScheme,wcslen(PowerScheme))!=ERROR_SUCCESS) {
                //it is always failing with error 0
                DWORD dw = GetLastError();  
            }

当然,目前的电力方案不会改变价值。但根据msdn: “如果函数成功,则返回值为ERROR_SUCCESS。  如果函数失败,则返回值为非零错误代码“。

我将非常感谢你的答案。

P.S。它在Windows 7中编译并以admin

的权限执行

3 个答案:

答案 0 :(得分:1)

你这是错误的方式。您需要自己更改注册表中的内容。

在MSDN网站上阅读Power Scheme Management,了解正确的方法。

答案 1 :(得分:1)

作为documentation statesRegOpenKeyEx不会更新GetLastError,返回值就是错误代码本身。你介意检查一下吗?

我敢打赌你这里有ERROR_ACCESS_DENIED错误。

UPD:虽然这可能会回答您的问题,但您应该考虑使用RedX建议的API来更新电源管理设置。此注册表项的权限是设置的(出于某种原因!),即使管理员只具有读取权限,也不会写入。

答案 2 :(得分:1)

在评论中,您声明RegOpenKeyEx返回ERROR_ACCESS_DENIED。这是因为您请求对由于UAC而没有足够权限的密钥进行写访问。您需要提升您的进程以写入此密钥。

正如其他人已经正确指出的那样,您不应该调用GetLastError,因为RegOpenKeyEx没有设置最后一个错误值,而是直接返回错误代码。更重要的是,您应该使用电源管理API而不是破解注册表。

即使您切换到电源管理API,您仍然需要管理员权限。您可以通过在application manifest中将requestedExecutionLevel设置为requireAdministrator来安排此操作。

在Visual Studio中,您可以在“链接器”下的项目配置中进行此更改清单文件| UAC执行级别。