RegCreateKeyEx 和 RegOpenKeyEx 成功但 RegSetValueEx 设置值失败
RegCreateKeyEx and RegOpenKeyEx succeeds but RegSetValueEx fails to set value
我正在尝试为 HKCR 下的测试键设置值。 RegCreateKeyEx 成功创建测试密钥,RegOpenKeyEx 成功打开密钥。 RegSetValueEx 输出 ERROR_SUCCESS
但实际上并未写入任何值。我已经解决了之前提出的所有类似问题,建议是在 HKLM\SOFTWARE\Wow6432Node
下创建密钥。我在 64 位 win 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[=10=]";
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 回答以查看我的代码哪里出错了。
I am trying to set value for a test key under HKCR. RegCreateKeyEx successfully creates the test key and RegOpenKeyEx successfully open the key. RegSetValueEx output ERROR_SUCCESS but doesn't actually write any values.
您没有将 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_ROOT
。 HKEY_CLASSES_ROOT
不是它自己的实际键,它实际上是 HKEY_LOCAL_MACHINE\Software\Classes
和 HKEY_CURRENT_USER\Software\Classes
键的合并视图:
Merged View of HKEY_CLASSES_ROOT.aspx
If you write keys to a key under HKEY_CLASSES_ROOT, the system stores the information under HKEY_LOCAL_MACHINE\Software\Classes. If you write values to a key under HKEY_CLASSES_ROOT, and the key already exists under HKEY_CURRENT_USER\Software\Classes, the system will store the information there instead of under 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[=12=]";
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[=13=]";
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
我正在尝试为 HKCR 下的测试键设置值。 RegCreateKeyEx 成功创建测试密钥,RegOpenKeyEx 成功打开密钥。 RegSetValueEx 输出 ERROR_SUCCESS
但实际上并未写入任何值。我已经解决了之前提出的所有类似问题,建议是在 HKLM\SOFTWARE\Wow6432Node
下创建密钥。我在 64 位 win 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[=10=]";
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 回答以查看我的代码哪里出错了。
I am trying to set value for a test key under HKCR. RegCreateKeyEx successfully creates the test key and RegOpenKeyEx successfully open the key. RegSetValueEx output ERROR_SUCCESS but doesn't actually write any values.
您没有将 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_ROOT
。 HKEY_CLASSES_ROOT
不是它自己的实际键,它实际上是 HKEY_LOCAL_MACHINE\Software\Classes
和 HKEY_CURRENT_USER\Software\Classes
键的合并视图:
Merged View of HKEY_CLASSES_ROOT.aspx
If you write keys to a key under HKEY_CLASSES_ROOT, the system stores the information under HKEY_LOCAL_MACHINE\Software\Classes. If you write values to a key under HKEY_CLASSES_ROOT, and the key already exists under HKEY_CURRENT_USER\Software\Classes, the system will store the information there instead of under 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[=12=]";
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[=13=]";
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