Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Checking if a registry key exists

I am looking for a clean way to check if a registry key exists. I had assumed that RegOpenKey would fail if I tried to open a key that didn't exist, but it doesn't.

I could use string processing to find and open the parent key of the one I'm looking for, and then enumerate the subkeys of that key to find out if the one I'm interested in exists, but that feels both like a performance hog and a weird way to have to implement such a simple function.

I'd guess that you could use RegQueryInfoKey for this somehow, but MSDN doesn't give too many details on how, even if it's possible.

Update: I need the solution in Win32 api, not in managed code, .NET or using any other library.

The docs in MSDN seem to indicate that you should be able to open a key for read permission and get an error if it doesn't exist, like this:

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

if (lResult != ERROR_SUCCESS) 
{
    if (lResult == ERROR_FILE_NOT_FOUND) {

However, I get ERROR_SUCCESS when I try this.

Update 2: My exact code is this:

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

... but result is ERROR_SUCCESS, even though I'm trying to open a key that does not exist.

Update 3: It looks like you guys are right. This fails on one specific test example (mysteriously). If I try it on any other key, it returns the correct result. Double-checking it with the registry editor still does not show the key. Don't know what to make of all that.

like image 209
slicedlime Avatar asked Aug 27 '09 20:08

slicedlime


1 Answers

First of all don't worry about performance for stuff like this. Unless you are querying it 100x per sec, it will be more than fast enough. Premature optimization will cause you all kinds of headaches.

RegOpenKeyEx will return ERROR_SUCCESS if it finds the key. Just check against this constant and you are good to go.

like image 104
Byron Whitlock Avatar answered Sep 20 '22 02:09

Byron Whitlock