检查是否存在注册表项

sli*_*ime 10 c c++ registry winapi

我正在寻找一种干净的方法来检查是否存在注册表项.我曾经认为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) {
Run Code Online (Sandbox Code Playgroud)

但是,ERROR_SUCCESS当我尝试这个时,我得到了.

更新2:我的确切代码是这样的:

HKEY subKey = nullptr;
LONG result = RegOpenKeyEx(key, subPath.c_str(), 0, KEY_READ, &subKey);
if (result != ERROR_SUCCESS) {
Run Code Online (Sandbox Code Playgroud)

......不过resultERROR_SUCCESS,即使我试图打开一个不存在的关键.

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

Byr*_*ock 11

首先不要担心这样的事情的表现.除非你每秒查询100次,否则它将足够快.过早优化会引起各种令人头疼的问题.

如果找到密钥,RegOpenKeyEx将返回ERROR_SUCCESS.只要检查这个常数,你就可以了.


180*_*ION 7

RegOpenKey如果密钥不存在,则会返回错误.你是怎么用的?预期的回报值是ERROR_FILE_NOT_FOUND.

从您的代码:

HKEY subKey = nullptr;
LONG result = RegOpenKeyEx(key, subPath.c_str(), 0, KEY_READ, &subKey);
if (result != ERROR_SUCCESS) {
Run Code Online (Sandbox Code Playgroud)

我会看看它的价值,keysubPath确保它们符合您的预期,而且密钥实际上并不存在.subKey之后的价值是什么?它显然是在打开一些东西 - 尝试枚举它以查看它下面的键和值是什么.

RegOpenKey如果密钥不存在则没有返回错误没有问题- 我不会尝试假设在某些常见的注册表中存在某种奇怪的操作系统错误.

也许您有一个对您不可见的注册表项,即运行注册表编辑器的用户,而不是您的代码?也许权限问题?您的代码是否在Windows Vista或Server 2008中作为提升用户运行?您是否尝试以管理员身份运行注册表编辑器?