RegCreateKeyEx 和 RegOpenKeyEx 成功,但 RegSetValueEx 无法设置值
RegCreateKeyEx and RegOpenKeyEx succeeds but RegSetValueEx fails to set value
我正在尝试为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_ROOT
。 HKEY_CLASSES_ROOT
本身并不是一个实际的键,它实际上是HKEY_LOCAL_MACHINESoftwareClasses
和HKEY_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
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何在24位SDL_Surface上设置像素的颜色
- std::设置自定义比较器
- 如何设置一个范围来提取我想要获得的信息
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 通过选项卡的文本设置QTabWidget顺序
- 将特征矩阵的向量设置为0
- RegCreateKeyEx 和 RegOpenKeyEx 成功,但 RegSetValueEx 无法设置值