Vérifier si une clé de registre existe

Je suis à la recherche d'un moyen propre à vérifier si une clé de registre existe. J'avais supposé que RegOpenKey échouerait si j'ai essayé d'ouvrir une clé qui n'existe pas, mais il ne le fait pas.

Je pouvais utiliser la chaîne de traitement de rechercher et d'ouvrir la clé parente de celle que je suis à la recherche pour, et puis énumérer les sous-clés de la clé pour savoir si celui que je m'intéresse à l'existence, mais qui se sent à la fois comme une représentation de porcs et d'une façon bizarre d'avoir à mettre en œuvre une telle fonction simple.

Je suppose que vous pourriez utiliser RegQueryInfoKey pour ce en quelque sorte, mais MSDN ne donnez pas trop de détails sur la façon dont, même si c'est possible.

Mise à jour: j'ai besoin de la solution dans l'api Win32, pas dans du code managé, .NET, ou en utilisant une autre bibliothèque.

La documentation MSDN semblent indiquer que vous devriez être en mesure d'ouvrir une clé pour l'autorisation de lecture et d'obtenir une erreur s'il n'existe pas, comme ceci:

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

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

Cependant, je reçois ERROR_SUCCESS quand j'ai essayer cette.

Mise à jour 2: Mon code exact est: est-ce

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

... mais result est ERROR_SUCCESS, même si j'essaie d'ouvrir une clé qui n'existe pas.

Mise à jour 3: On dirait que vous les gars sont à droite. Cette échoue sur un exemple de test (mystérieusement). Si je l'ai essayer sur une autre touche, elle renvoie le résultat correct. Double-vérifier avec l'éditeur du registre n'affiche toujours pas la clé. Ne sais pas quoi faire de tout ça.

Quel est le chemin d'accès à la clé que vous êtes arrivée? Est-il possible que vous êtes en cours d'exécution dans un de la magie des chemins qui obtient redirigé (comme Wow6432Node)? J'ai un vague souvenir de voir ce problème avant. Je pense que vous pouvez ouvrir un inexistante clé. Vous obtenez une erreur lorsque vous essayez réellement de définir ou de requête une valeur dans cette clé.
Il pourrait aussi être dans le registre VirtualStore.

OriginalL'auteur slicedlime | 2009-08-27