RegCreateKeyEx 和 RegOpenKeyEx 成功,但 RegSetValueEx 无法设置值

RegCreateKeyEx and RegOpenKeyEx succeeds but RegSetValueEx fails to set value

本文关键字:设置 RegSetValueEx RegOpenKeyEx 成功 RegCreateKeyEx      更新时间:2023-10-16

我正在尝试为HKCR下的测试密钥设置值。RegCreateKeyEx成功创建了测试密钥,RegOpenKeyEx成功打开了密钥。RegSetValueEx 输出ERROR_SUCCESS,但实际上不会写入任何值。我已经经历了之前提出的所有类似问题,建议是在HKLMSOFTWAREWow6432Node下创建密钥。我在 64 位 win 10 上,testkey 在 HKCR 下;HKLMSOFTWAREWow6432Node下没有类似的内容.我尝试了两种不同的RegSetValueEx,但都不起作用。我做错了什么?

HKEY hKey;
LONG lResult;
lResult = RegCreateKeyEx(HKEY_CLASSES_ROOT, "testKey", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL );
if(lResult == ERROR_SUCCESS)
    cout<<"Success! Key Created!"<<endl;
lResult = RegOpenKeyEx(HKEY_CLASSES_ROOT, "testKey", 0, KEY_ALL_ACCESS, &hKey);
if(lResult == ERROR_SUCCESS){
    cout<<"Success! Key Opened!"<<endl;
    const char info[] = "URL:URITest Link";
    lResult = RegSetValueEx(HKEY_CLASSES_ROOT,"",0,REG_SZ,(BYTE*) info,strlen(info));
    //lResult = RegSetValueEx(HKEY_CLASSES_ROOT,"URL Protocol",0,REG_NONE,NULL,0);
    if(lResult == ERROR_SUCCESS)
        cout<<"Success! Value Set!"<<endl;
    else
        cout<<lResult<<endl;
}

编辑:请参阅下面的@Remy Lebeau答案,看看我的代码在哪里出错。

我正在尝试为 HKCR 下的测试密钥设置值。RegCreateKeyEx成功创建了测试密钥,RegOpenKeyEx成功打开了密钥。RegSetValueEx 输出ERROR_SUCCESS,但实际上不会写入任何值。

您没有将 RegOpenKeyEx() 返回的HKEY句柄传递给RegSetValueEx() 。 您需要将硬编码的HKEY_CLASSES_ROOT替换为第一个参数中的hKey变量:

lResult = RegSetValueEx(hKey, "URL Protocol", 0, REG_NONE, NULL,0);

但是,为了使其正常工作,您还需要更改RegOpenKeyEx()调用以请求KEY_WRITE(或至少KEY_SET_VALUE)权限。 您正在以KEY_READ权限打开密钥。不能写入只读密钥:

lResult = RegOpenKeyEx(HKEY_CLASSES_ROOT, "testKey", 0, KEY_SET_VALUE, &hKey);

话虽如此,你不应该一开始就直接写信给KEY_CLASSES_ROOTHKEY_CLASSES_ROOT 本身并不是一个实际的键,它实际上是HKEY_LOCAL_MACHINESoftwareClassesHKEY_CURRENT_USERSoftwareClasses键的合并视图:

HKEY_CLASSES_ROOT键

HKEY_CLASSES_ROOT.aspx的合并视图

如果将密钥

写入 HKEY_CLASSES_ROOT 下的密钥,系统会将信息存储在 HKEY_LOCAL_MACHINE\软件\类 下。如果将值写入 HKEY_CLASSES_ROOT 下的键,并且该键已存在于 HKEY_CURRENT_USER\Software\Classes 下,则系统将在那里存储信息,而不是存储在 HKEY_LOCAL_MACHINE\Software\Classes 下。

如果要注册只有当前用户才能访问的 URI 方案,请将其保存在 HKEY_CURRENT_USERSoftwareClassestestKey 中:

HKEY hKey;
LONG lResult;
lResult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\Classes\testKey", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL);
if (lResult == ERROR_SUCCESS)
{
    cout << "Success! Key Created!" << endl;
    const char info[] = "URL:URITest Link";
    lResult = RegSetValueEx(hKey, "" , 0, REG_SZ, (BYTE*) info, sizeof(info));
    if (lResult == ERROR_SUCCESS)
        lResult = RegSetValueEx(hKey, "URL Protocol", 0, REG_NONE, NULL, 0);
    if (lResult == ERROR_SUCCESS)
        cout << "Success! Value Set!" << endl;
    else
        cout << lResult << endl;
    RegCloseKey(hKey);
}

如果希望所有用户都可以访问 URI 方案,请将其保存在 HKEY_LOCAL_MACHINESoftwareClassestestKey 中:

HKEY hKey;
LONG lResult;
lResult = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "Software\Classes\testKey", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL);
if (lResult == ERROR_SUCCESS)
{
    cout << "Success! Key Created!" << endl;
    const char info[] = "URL:URITest Link";
    lResult = RegSetValueEx(hKey, "" , 0, REG_SZ, (BYTE*) info, sizeof(info));
    if (lResult == ERROR_SUCCESS)
        lResult = RegSetValueEx(hKey, "URL Protocol", 0, REG_NONE, NULL, 0);
    if (lResult == ERROR_SUCCESS)
        cout << "Success! Value Set!" << endl;
    else
        cout << lResult << endl;
    RegCloseKey(hKey);
}
我想

你应该把hKey传递到RegSetValueEx