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

时间:2016-04-27 04:48:26

标签: c++ winapi registry

我正在尝试为HKCR下的测试密钥设置值。 RegCreateKeyEx成功创建测试密钥,RegOpenKeyEx成功打开密钥。 RegSetValueEx输出ERROR_SUCCESS但实际上并没有写任何值。我已经完成了之前提出的所有类似问题,并且建议密钥将在HKLM\SOFTWARE\Wow6432Node下创建。我在64位胜利10,testkey在HKCR之下;在HKLM\SOFTWARE\Wow6432Node下没有类似的内容。我尝试了两种不同的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\0";
    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回答,看看我的代码出错了。

2 个答案:

答案 0 :(得分:3)

  

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

您没有将HKEY返回的RegOpenKeyEx()句柄传递给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_ROOT来开始。 HKEY_CLASSES_ROOT不是它自己的实际密钥,它实际上是HKEY_LOCAL_MACHINE\Software\ClassesHKEY_CURRENT_USER\Software\Classes密钥的合并视图:

HKEY_CLASSES_ROOT Key

Merged View of HKEY_CLASSES_ROOT。ASPX

  

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

如果您想注册只有当前用户可访问的URI方案,请将其保存在HKEY_CURRENT_USER\Software\Classes\testKey中:

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\0";
    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_MACHINE\Software\Classes\testKey

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\0";
    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);
}

答案 1 :(得分:0)

我猜您应该将hKey传递给RegSetValueEx