【发布时间】:2017-06-30 03:39:55
【问题描述】:
我无法使用 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);
我不知道如何继续,所以任何帮助将不胜感激。
编辑:我通过 regedit 确认密钥确实存在。似乎如果 RegOpenKeyEx 的第二个参数不是 NULL,它会返回错误代码 2。
编辑 2:我尝试了多种解决方案,包括在子项上使用 TEXT() 函数并将访问权限更改为 KEY_SET_VALUE,但我仍然遇到相同的错误。我也尝试使用 RegCreateKeyEx。奇怪的是,我仍然得到错误代码 2,虽然有时我得到错误代码 122 (ERROR_INSUFFICENT_BUFFER)。
编辑 3:我更改了错误处理,因此它直接使用函数的返回值而不是 GetLastError()。我现在得到错误代码 5 (ERROR_ACCESS_DENIED)。
【问题讨论】:
-
您是否在 Regedit 中验证了此密钥确实存在?我的 Windows 10 系统上没有这样的密钥,无论是在普通注册表下还是在 WOW6432Node 重定向下。
-
@MrEricSir 它是
AddFontResource()文档和Font Installation and Deletion 中提到的注册表项。它是指安装在%windir%\fonts文件夹之外的字体。如果您没有此类字体,则可能永远不会创建密钥 -
错误码清晰。文件未找到。这条路不存在。你还需要什么解释?
-
请提供minimal reproducible example。同时最好的猜测:您忽略了来自编译器的关于 RegOpenKeyEx 的无效参数的警告消息,这是由提供窄字符串而不是宽字符串引起的。 (试着让它
L"SOFTWARE\\Microsoft...) -
错误代码再清楚不过了。系统比你更值得信赖。我相信这个系统是正确的。
标签: c++ windows winapi fonts registry