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.

2
Mr.C64 20 avril 2017 à 21:11

3 réponses

Meilleure réponse

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.

3
David Heffernan 20 avril 2017 à 18:22

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.

4
zett42 20 avril 2017 à 19:33

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.

0
user7860670 20 avril 2017 à 18:28