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

Posted

技术标签:

【中文标题】尝试更改 ActivePowerScheme:RegOpenKeyEx 失败,错误 0【英文标题】:try to change ActivePowerScheme: RegOpenKeyEx failed with error 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() 返回什么值? 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

作为documentation states,RegOpenKeyEx不会更新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 调用的不同注册表设置

以上是关于尝试更改 ActivePowerScheme:RegOpenKeyEx 失败,错误 0的主要内容,如果未能解决你的问题,请参考以下文章

使用 .htaccess 更改端口和主机 [关闭]

为啥我的 Entity Framework Core Database-First 模型自定义更改在 Re-Scaffold 后消失了?任何解决方案

如何更改 QPalette 的当前颜色组

关于RE

如何更改表格的HiddenInput值

Google Dialogflow 没有利用我的更改