C++ RegSetValueEx不';不要创建字符串值

C++ RegSetValueEx不';不要创建字符串值,c++,regedit,C++,Regedit,我阅读了一些文档并查看了代码示例,但我找不到代码不起作用的任何原因 #include <iostream> #include <string> #include <Windows.h> using namespace std; void AddSubKeyWithValue(HKEY hRootKey, LPWSTR strSubKey, LPCTSTR StringVal, LPCTSTR data) { HKEY hKey; RegOpe

我阅读了一些文档并查看了代码示例,但我找不到代码不起作用的任何原因

#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;

void AddSubKeyWithValue(HKEY hRootKey, LPWSTR strSubKey, LPCTSTR StringVal, LPCTSTR data)
{
    HKEY hKey;
    RegOpenKeyEx(hRootKey, strSubKey, NULL, KEY_ALL_ACCESS, &hKey);
    RegSetValueEx(hRootKey, StringVal, NULL, REG_SZ, (LPBYTE)&data, sizeof(REG_SZ));
    RegCloseKey(hKey);
    return;
}


void main() {

    AddSubKeyWithValue(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",L"Slayer Tool", L"c:\\Slayer\\Update.exe");

    system("pause");
    return;

}
#包括
#包括
#包括
使用名称空间std;
void AddSubKeyWithValue(HKEY hRootKey、LPWSTR strSubKey、LPCTSTR StringVal、LPCTSTR数据)
{
HKEY HKEY;
RegOpenKeyEx(hRootKey、strSubKey、NULL、KEY\u ALL\u ACCESS和hKey);
RegSetValueEx(hRootKey,StringVal,NULL,REG_SZ,(LPBYTE)和data,sizeof(REG_SZ));
雷克洛斯基(香港中学),;
返回;
}
void main(){
AddSubKeyWithValue(HKEY_LOCAL_机器,L“软件\\Microsoft\\Windows\\CurrentVersion\\Run”,L“Slayer工具”,L“c:\\Slayer\\Update.exe”);
系统(“暂停”);
返回;
}

RegSetValueEx调用已全部关闭。第一个参数应该是子键句柄,而不是HKEY_LOCAL_机器。第5个参数应该指向数据,而不是指向数据的指针。第6个参数应该包含字符串长度,以字节为单位(请记住它是一个宽字符串),包括终止null

因此,重新表述如下:

RegSetValueEx(hKey, StringVal, NULL, REG_SZ, (LPBYTE)data, sizeof(wchar_t)*(wcslen(data)+1));
最重要的是,HKEY_LOCAL_机器对于非管理员用户是只读的,即使对于管理员用户,它也是只读的,没有权限提升


另外,
system(“暂停”)
是等待按键的可怕方式。改为调用“getch()。

RegSetValueEx调用已全部关闭。第一个参数应该是子键句柄,而不是HKEY_LOCAL_机器。第5个参数应该指向数据,而不是指向数据的指针。第6个参数应该包含字符串长度,以字节为单位(请记住它是一个宽字符串),包括终止null

因此,重新表述如下:

RegSetValueEx(hKey, StringVal, NULL, REG_SZ, (LPBYTE)data, sizeof(wchar_t)*(wcslen(data)+1));
最重要的是,HKEY_LOCAL_机器对于非管理员用户是只读的,即使对于管理员用户,它也是只读的,没有权限提升


另外,
system(“暂停”)
是等待按键的可怕方式。改为调用“getch()”。

它不起作用,但我的参数错误是正确的。请始终检查返回值
RegSetValueEx()
(或者更可能的是
RegOpenKeyEx()
)由于未捕获的错误而失败。不要使用
KEY\u ALL\u ACCESS
,在这种情况下,
KEY\u SET\u VALUE
本身就足够了,只要代码是以管理员权限运行的,因为它试图写入
HKLM
,而HKLM受非管理员写入的保护。访问安全资源时,请不要请求超出实际需要的权限。该操作不起作用,但“我的参数”错误中的说明是正确的。请始终检查返回值
RegSetValueEx()
(或者更可能的是
RegOpenKeyEx()
)由于未捕获的错误而失败。不要使用
KEY\u ALL\u ACCESS
,在这种情况下,
KEY\u SET\u VALUE
本身就足够了,只要代码是以管理员权限运行的,因为它试图写入
HKLM
,而HKLM受非管理员写入的保护。访问安全资源时,决不要请求超出实际需要的权限。