C++ RegOpenKeyEx返回错误代码5(错误访问被拒绝)
使用RegOpenKeyEx函数打开注册表项时遇到问题。我正在编写的特定程序将字体安装到计算机上,它们必须添加到注册表中,以便在重新启动后保持安装状态。我是全新的使用注册表,所以我一直在查找,但我遇到了一个问题。下面的示例显示了我发送给RegOpenKeyEx的参数:C++ RegOpenKeyEx返回错误代码5(错误访问被拒绝),c++,windows,winapi,fonts,registry,C++,Windows,Winapi,Fonts,Registry,使用RegOpenKeyEx函数打开注册表项时遇到问题。我正在编写的特定程序将字体安装到计算机上,它们必须添加到注册表中,以便在重新启动后保持安装状态。我是全新的使用注册表,所以我一直在查找,但我遇到了一个问题。下面的示例显示了我发送给RegOpenKeyEx的参数: int main() { HKEY key; long code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\Curre
int main() {
HKEY key;
long code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts", 0, KEY_ALL_ACCESS, &key);
if(code != ERROR_SUCCESS) {
std::cout << code << std::endl;
return 1;
}
RegCloseKey(key);
return 0;
}
我不知道如何进行,因此任何帮助都将不胜感激
编辑:我用regedit确认密钥确实存在。如果RegOpenKeyEx的第二个参数不是NULL,那么它将返回错误代码2
编辑2:我尝试了多种解决方案,包括对子键使用TEXT()函数和将访问权限更改为KEY_SET_VALUE,但我仍然得到相同的错误。我还尝试使用RegCreateKeyEx。奇怪的是,我仍然得到错误代码2,尽管有时我得到错误代码122(错误缓冲区不足)
编辑3:我更改了错误处理,因此它直接使用函数的返回值,而不是GetLastError()。我现在得到错误代码5(错误访问被拒绝)。HKEY\U LOCAL\U机器的伪键句柄指向名为
\Registry\MACHINE
的键,该键用作注册表配置单元的安装点之一。我怀疑您是否可以通过标准Windows API(如RegOpenKeyEx
)打开此密钥或枚举其子密钥。也许,本机API(NtOpenKey
)可以工作
通过调用RegLoadKey
函数,可以在HKEY\U LOCAL\U机器
键下创建子键。如果需要枚举这些子键,可以查看HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist
下的值;值名称告诉您注册表路径–以\registry\Machine
开头的是HKEY\U LOCAL\U Machine
的子项
HKEY\U用户可能表现出相同的行为。根据Microsoft文档:
RegOpenKey函数使用默认的安全访问掩码打开密钥。如果打开密钥需要不同的访问权限,则函数将失败,返回错误\u access\u DENIED。在这种情况下,应用程序应使用RegOpenKeyEx函数指定访问掩码
所以这可能意味着你实际上没有访问密钥的权限
我在上面的页面中找到以下链接:
也就是说:
要查看项(包括预定义项)的当前访问权限,请使用注册表编辑器(Regedt32.exe)。导航到所需的键后,转到“编辑”菜单并选择“权限”
我个人使用的钥匙有以下问题:
因为我不在那里,我无法访问它。。。(虽然我是管理员,但可能需要管理员权限)
如果是单系统问题,您可以在regedit中更改它
如果您正在制作的软件需要它,您必须找到另一种方法,可能是一个需要请求管理员权限的脚本。不管它值多少钱,我都遇到了同样的问题:获取错误代码=5,访问被拒绝。
在HKEY_LOCAL_机器区域内,我尝试使用Regcreatekeyex、RegOpenKeyEx和相关函数来打开和关闭
将数据写入HKEY_LOCAL_机器区域注册表,但未成功。所以我试着使用HKEY_当前_用户区,现在我
成功地打开并将数据写入HKEY_CURRENT_用户区注册表,并取得了可验证的成功,我看到了成功,
甚至认为我没有在我想写的领域写数据。听起来HKEY_LOCAL_机器区是个禁区 您是否已在Regedit中验证此密钥是否确实存在?在我的Windows 10系统中,无论是在普通注册表下还是在WOW6432Node重定向下,都没有这样的注册表项。@MrEricSir它是文档中提到的注册表项,也是。它是指安装在%windir%\font
文件夹之外的字体。如果没有此类字体,则可能无法创建密钥错误代码很清楚。找不到文件。这条路并不存在。您还需要什么样的解释?请提供一个详细的说明。同时最好的猜测是:您忽略了编译器发出的关于RegOpenKeyEx的无效参数的警告消息,这是由提供窄字符串而不是宽字符串引起的。(尝试将其设置为L“SOFTWARE\\Microsoft…
)错误代码非常清楚。系统比您更值得信任。我相信系统是正确的。
HKEY key;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, NULL, 0, KEY_ALL_ACCESS, &key);