Supposons que vous souhaitiez développer une fonction qui, étant donné un handle de clé de registre valide et un nom de valeur, renvoie true si la valeur existe sous la clé d'entrée, false si elle ne le fait pas ' t et lève une exception C ++ dans tous les autres cas.
bool RegValueExists(HKEY hKey, const std::wstring& value)
{
LRESULT retCode = ::RegGetValue(
hKey,
nullptr, // no subkey
value.c_str(),
RRF_RT_ANY, // any type
nullptr, nullptr, nullptr // not interested in these
);
Si RegGetValue
réussit, il renvoie 0
; donc, dans ce cas, je peux renvoyer true
à l'appelant.
Mais, à partir de la documentation MSDN de RegGetValue
, ce n'est pas clair ce que l'API renvoie en cas de valeur de registre introuvable:
Valeur de retour
[...] Si la fonction échoue, la valeur de retour est un code d'erreur système.
Dans mes tests, RegGetValue
renvoie 2
(c'est-à-dire ERROR_FILE_NOT_FOUND
) en cas de valeurs introuvables. Cependant, je ne trouve aucune page MSDN officielle documentant cela. (De plus, depuis quand une valeur de registre est-elle un fichier ??)
Parmi les "codes d'erreur système" , il y a aussi un code ERROR_NOT_FOUND
(1168
). Serait-il raisonnable de l'attendre comme un code de retour pour "valeur de registre non trouvée" ?
Je pense qu'il devrait y avoir une explication claire d'au moins les codes d'erreur communs dans MSDN.
3 réponses
Il n'y a pas de documentation sur tous les modes de défaillance et leurs codes d'erreur. C'est juste la manière des choses. Certains modes de défaillance sont explicitement appelés avec le code d'erreur documenté.
Cependant, je peux confirmer que ERROR_FILE_NOT_FOUND
est le code d'erreur associé au mode d'échec décrit dans la question.
RegQueryValueEx
a une spécification d'erreur plus détaillée:
Si la valeur de registre lpValueName n'existe pas, la fonction renvoie ERROR_FILE_NOT_FOUND.
Donc, si vous voulez être du bon côté, utilisez cette fonction au lieu de RegGetValue
.
D'après votre exemple, je vois que vous n'avez besoin d'aucune des fonctionnalités spéciales de RegGetValue
et je pense que ces fonctionnalités pourraient même être émulées avec une combinaison de RegOpenKeyEx
et RegQueryValueEx
.
Il serait raisonnable de s'attendre à une valeur renvoyée, mais ERROR_SUCCESS soit un code d'erreur. La liste exacte des codes d'erreur potentiellement renvoyés varie probablement entre les versions de Windows.
Je pense qu'il devrait y avoir une explication claire au moins des codes d'erreur courants dans MSDN.
Mais votre citation de la page MSDN contient en fait un lien vers le liste des codes d'erreur système, vous pouvez également obtenir une description d'erreur à tout moment en appelant FormatMessageW
.
De nouvelles questions
c++
C ++ est un langage de programmation à usage général. Il a été conçu à l'origine comme une extension de C et a une syntaxe similaire, mais c'est maintenant un langage complètement différent. Utilisez cette balise pour les questions sur le code (à être) compilé avec un compilateur C ++. Utilisez une balise spécifique à la version pour les questions liées à une révision standard spécifique [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] ou [C ++ 23], etc. .