c ++ RegSetValueEx - Regedit

时间:2016-06-15 19:01:40

标签: c++ winapi

我试图在c ++中为注册表添加一个值。程序运行并没有错误。 I未创建值(RegSetValueEx)。 代码:

HKEY hkey;
long regOpenResult;
const char path[] = "C:\\test";

regOpenResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, 
    KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hkey);

LPCSTR stuff = "test";
RegSetValueEx(hkey, stuff, 0, REG_SZ, (BYTE*)path, strlen(path));

谢谢你的帮助! :)

2 个答案:

答案 0 :(得分:2)

您没有检查错误,也没有使用正确的权限。 KEY_ALL_ACCESS仅限于管理员(首先写入HKLM)。请改用KEY_SET_VALUE

HKEY hkey;
LONG regResult;
const char path[] = "C:\\test";

regResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, 
    KEY_SET_VALUE | KEY_WOW64_64KEY, &hkey);
if (regResult != ERROR_SUCCESS)
{
    // error opening the key, do something...
}
else
{
    regResult = RegSetValueEx(hkey, "test", 0, REG_SZ, (BYTE*)path, strlen(path)+1);
    if (regResult != ERROR_SUCCESS)
    {
        // error writing to the key, do something...
    }
    RegCloseKey(hkey);
}

然后确保您的代码由管理员用户运行(如果启用了UAC,则在升级过程中)。标准用户无法写入HKLM,除非管理员应用安全策略授予对标准用户的写入权限。

答案 1 :(得分:1)

您不检查错误的返回值。对RegOpenKeyEx的调用返回ERROR_ACCESS_DENIED的可能性非常高。这是因为标准用户无权修改HKLM。

如果您需要修改HKLM,则需要在升级过程中执行此代码。将runAsAdministrator选项添加到清单中,或使用 Run as admin 菜单项启动它。

但首先要做的是添加错误检查,以便您可以诊断故障而不是完全处于黑暗状态。

当您调用strlen(...) + 1时,您还应该传递RegSetValueEx,以便将空终止符写入注册表。