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.
Il pourrait aussi être dans le registre VirtualStore.
OriginalL'auteur slicedlime | 2009-08-27
Vous devez vous connecter pour publier un commentaire.
Tout d'abord ne vous inquiétez pas au sujet de la performance pour des trucs comme ça. Sauf si vous interrogez il 100x par sec, il sera plus que assez rapide. L'optimisation prématurée va vous causer toutes sortes de maux de tête.
RegOpenKeyEx sera de retour ERROR_SUCCESS si elle trouve la clé. Il suffit de vérifier à l'encontre de cette constante et vous êtes bon pour aller.
OriginalL'auteur Byron Whitlock
RegOpenKey
retourne une erreur si la clé n'existe pas. Comment l'utilisez-vous? La valeur de retour attendue estERROR_FILE_NOT_FOUND
.À partir de votre code:
Je regarde la valeur de
key
etsubPath
et assurez-vous qu'ils sont ce à quoi vous vous attendez, et que la clé n'existe pas dans la réalité. Quelle est la valeur desubKey
par la suite? C'est évidemment l'ouverture de quelque chose, essayez de l'énumération, de voir ce que les clés et les valeurs sous.Il n'y a pas de problème avec
RegOpenKey
pas de retourner une erreur si la clé n'existe pas - je ne voudrais pas essayer de supposer qu'il y a une sorte de bizarre OS bug dans quelque chose d'aussi couramment utilisé comme la base de registre.Peut-être que vous avez une clé de registre qui n'est pas visible pour vous, l'utilisateur qui exécute l'éditeur du registre, mais pas à votre code? Un problème d'autorisations peut-être? Votre code est exécuté comme une élévation de l'utilisateur dans windows Vista ou server 2008? Avez-vous essayer de lancer l'éditeur du registre en tant qu'administrateur?
OriginalL'auteur 1800 INFORMATION
Noter qu'à côté de la "base" du Registre des fonctions qui commencent par "Reg" il y a aussi des fonctions d'assistance en commençant par "SHReg". Elles sont destinées à l'utilisation par le Shell c'est à dire l'Explorateur, mais sont documentés et peuvent être utilisés dans les applications normales. Ils sont généralement mince wrappers de faire certaines tâches courantes plus facilement. Ils font partie de la "Shell API Légère" (shlwapi.dll)
OriginalL'auteur MSalters