Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.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++ 检查注册表项是否存在_C++_C_Winapi_Registry - Fatal编程技术网

C++ 检查注册表项是否存在

C++ 检查注册表项是否存在,c++,c,winapi,registry,C++,C,Winapi,Registry,我正在寻找一种干净的方法来检查注册表项是否存在。我曾假设如果我试图打开一个不存在但不存在的密钥,RegOpenKey将失败 我可以使用字符串处理来查找并打开我正在查找的父键,然后枚举该键的子键,以确定我感兴趣的子键是否存在,但这感觉既像是一种性能限制,又是一种必须实现如此简单函数的奇怪方式 我想您可以使用RegQueryInfoKey来实现这一点,但是MSDN没有给出太多关于如何实现的细节,即使这是可能的 更新:我需要Win32 api中的解决方案,而不是托管代码、.NET或使用任何其他库 MS

我正在寻找一种干净的方法来检查注册表项是否存在。我曾假设如果我试图打开一个不存在但不存在的密钥,
RegOpenKey
将失败

我可以使用字符串处理来查找并打开我正在查找的父键,然后枚举该键的子键,以确定我感兴趣的子键是否存在,但这感觉既像是一种性能限制,又是一种必须实现如此简单函数的奇怪方式

我想您可以使用
RegQueryInfoKey
来实现这一点,但是MSDN没有给出太多关于如何实现的细节,即使这是可能的

更新:我需要Win32 api中的解决方案,而不是托管代码、.NET或使用任何其他库

MSDN中的文档似乎表明,您应该能够为读取权限打开一个密钥,如果该密钥不存在,则会得到一个错误,如下所示:

lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey);

if (lResult != ERROR_SUCCESS) 
{
    if (lResult == ERROR_FILE_NOT_FOUND) {
但是,当我尝试此操作时,我得到了
ERROR\u SUCCESS

更新2:我的确切代码如下:

HKEY subKey = nullptr;
LONG result = RegOpenKeyEx(key, subPath.c_str(), 0, KEY_READ, &subKey);
if (result != ERROR_SUCCESS) {
。。。但是
result
ERROR\u SUCCESS
,即使我试图打开一个不存在的密钥


更新3:看起来你们是对的。这在一个特定的测试示例中失败(神秘地)。如果我在任何其他键上尝试,它将返回正确的结果。使用注册表编辑器对其进行双重检查仍然不会显示该项。我不知道该怎么做。

首先,不要担心这样的东西的性能。除非您每秒查询100次,否则它将足够快。过早的优化会让你头痛不已


如果找到密钥,RegOpenKeyEx将返回错误\u SUCCESS。只要检查这个常量,就可以了。

RegOpenKey
如果密钥不存在,就会返回一个错误。你是怎么用的?预期的返回值为
错误\u文件\u未找到

从您的代码:

HKEY subKey = nullptr;
LONG result = RegOpenKeyEx(key, subPath.c_str(), 0, KEY_READ, &subKey);
if (result != ERROR_SUCCESS) {
我会查看
key
subPath
的值,确保它们是您期望的值,并且密钥实际上不存在。
子键的值是多少?它显然是在打开一些东西——尝试枚举它,看看它下面的键和值是什么

如果注册表项不存在,
RegOpenKey
不返回错误是没有问题的-我不会试图假设在注册表这样常用的东西中存在某种奇怪的操作系统错误


也许您有一个注册表项对您(运行注册表编辑器的用户)不可见,但对您的代码不可见?可能是权限问题吧?您的代码在windows Vista或server 2008中是否以提升用户身份运行?您是否尝试以管理员身份运行注册表编辑器?

请注意,除了以“Reg”开头的“core”注册表函数外,还有以“SHReg”开头的helper函数。这些工具适用于IE浏览器,但有文档记录,也可用于普通应用程序。它们通常是薄包装,使一些常见任务更容易。它们是“Shell轻量级API”(shlwapi.dll)的一部分。

好吧,这与其说是过早优化,不如说是不想给代码增加那种复杂性。你要检查的密钥的路径是什么?有没有可能您遇到了被重定向的神奇路径之一(如Wow6432Node)?我模糊地记得以前见过这个问题。我想你可以打开一把不存在的钥匙。当您实际尝试设置或查询该键中的值时,您将失败。它也可能在中。您还可以获得错误路径。如果
RegOpenKeyEx
成功,请不要忘记调用
RegCloseKey(子键)