【问题标题】:try to change ActivePowerScheme: RegOpenKeyEx failed with error 0尝试更改 ActivePowerScheme:RegOpenKeyEx 失败,错误 0
【发布时间】:2011-10-04 09:07:27
【问题描述】:

我需要通过在注册表项 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。 如果函数失败,返回值是一个非零的错误码”。

我将不胜感激您的任何回答。

附:它在 Windows 7 中编译并以管理员权限执行

【问题讨论】:

  • RegOpenKeyEx() 返回什么值?

标签: c++ winapi windows-7 registry


【解决方案1】:

你这样做是错误的。您很少需要自己更改注册表中的内容。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 她的做法并不正确。她不应该打开钥匙(即使可能),而是使用为其提供的功能。无法保证这些密钥在下一个 Windows 版本中仍然存在。
    • 我同意这一点。每当在注册表设置之上有 API 时,都必须通过 API 来完成。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 感谢您的解释,但 PowerSetActiveScheme(NULL,(const GUID *)"8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c") 返回 ERROR_SUCCES 但当前电源方案没有改变
    • 这是一个不同的问题。我建议您在此处接受其中一个答案,并将电源方案 API 作为一个新问题提出。
    • 我自己研究过。静态常量 GUID guid = { 0x8c5e7fda, 0xe8bf, 0x4a96, { 0x9a, 0x85, 0xa6, 0xe2, 0x3a, 0x8c, 0x63, 0x5c } }; PowerSetActiveScheme(NULL,&guid);
    • 我假设您会对这个功能不需要管理员权限并且可以由具有通常访问权限的用户执行。
    • 我猜它一定是支持您的 api 调用的不同注册表设置
    猜你喜欢
    • 2018-01-06
    • 2017-01-10
    • 2017-10-24
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    相关资源
    最近更新 更多