Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ RegOpenKeyEx返回错误代码5(错误访问被拒绝)_C++_Windows_Winapi_Fonts_Registry - Fatal编程技术网

C++ RegOpenKeyEx返回错误代码5(错误访问被拒绝)

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

使用RegOpenKeyEx函数打开注册表项时遇到问题。我正在编写的特定程序将字体安装到计算机上,它们必须添加到注册表中,以便在重新启动后保持安装状态。我是全新的使用注册表,所以我一直在查找,但我遇到了一个问题。下面的示例显示了我发送给RegOpenKeyEx的参数:

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);