我无法使用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;
}
该函数返回1(ERROR_INVALID_FUNCTION)。但是,以下操作正常,并返回0:
HKEY key;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, NULL, 0, KEY_ALL_ACCESS, &key);
我不知道如何继续,所以任何帮助都将不胜感激。
编辑:我用注册表证实密钥确实存在。似乎如果RegOpenKeyEx的第二个参数不是NULL,则返回错误代码2.编辑2:我尝试了多种解决方案,包括在子项上使用TEXT()函数并将访问权限更改为KEY_SET_VALUE,但我仍然得到相同的错误。我也尝试过使用RegCreateKeyEx。奇怪的是,我仍然得到错误代码2,但有时我得到错误代码122(ERROR_INSUFFICENT_BUFFER)。
编辑3:我更改了错误处理,因此它直接使用函数的返回值而不是GetLastError()。我现在得到错误代码5(ERROR_ACCESS_DENIED)。
答案 0 :(得分:0)
根据Microsoft文档: https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regopenkeyw
RegOpenKey函数使用默认的安全访问掩码来打开密钥。如果打开钥匙需要其他访问权限,则该函数将失败,并返回ERROR_ACCESS_DENIED。在这种情况下,应用程序应使用RegOpenKeyEx函数指定访问掩码。
因此,这可能意味着您实际上无权访问密钥。
在上面的页面中的链接之后,我发现:https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-key-security-and-access-rights
说:
要查看某个键(包括预定义的键)的当前访问权限,请使用注册表编辑器(Regedt32.exe)。导航到所需的键后,转到“编辑”菜单,然后选择“权限”。
对于我个人遇到的钥匙,我有以下几点:
由于我不在那里,所以无法访问它(即使我是管理员,也许它需要管理员权限)
如果是单系统问题,则可以在regedit中进行更改。
如果您要制作的软件需要它,则必须找到另一种方法,也许是需要请求管理员权限的脚本。
答案 1 :(得分:0)
无论如何,我都遇到同样的问题,错误代码= 5,访问被拒绝。
在HKEY_LOCAL_MACHINE区域中,我试图使用Regcreatekeyex和RegOpenKeyEx及其相关函数来打开和
将数据写入HKEY_LOCAL_MACHINE区域注册表---并没有成功。所以我尝试使用HKEY_CURRENT_USER区域,现在我
在成功打开数据并将数据写入HKEY_CURRENT_USER区域注册表中取得了成功,我看到了成功,
甚至以为我没有在我想要的区域中写入数据。听起来HKEY_LOCAL_MACHINE区域有点超出限制。
答案 2 :(得分:-2)
HKEY_LOCAL_MACHINE
伪键句柄指向名为\Registry\Machine
的键,该键用作注册表配置单元的挂载点之一。我怀疑您是否可以通过标准Windows API(例如RegOpenKeyEx
)打开此密钥或枚举其子密钥。也许,原生API(NtOpenKey
)可行。
您可以通过调用HKEY_LOCAL_MACHINE
函数在RegLoadKey
键下创建一个子项。如果您需要枚举这些子项,可以查看HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist
下的值;值名称告诉您注册表路径 - 以\Registry\Machine
开头的那些是HKEY_LOCAL_MACHINE
的子项。
HKEY_USERS
可能表现出相同的行为。