我试图在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));
谢谢你的帮助! :)
答案 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
,以便将空终止符写入注册表。