Ich suche nach einem sauberen Weg, um zu überprüfen, ob ein Registrierungsschlüssel existiert. Ich hatte angenommen, dass RegOpenKey fehlschlagen würde, wenn ich versuchte, einen Schlüssel zu öffnen, der nicht existierte, aber es nicht tut.Überprüfen, ob ein Registrierungsschlüssel existiert
Ich könnte String-Verarbeitung verwenden, um den übergeordneten Schlüssel des gesuchten zu finden und zu öffnen, und dann die Unterschlüssel dieses Schlüssels aufzuzählen, um herauszufinden, ob der, an dem ich interessiert bin, existiert, aber beides wie ein Performance-Schwein und wie eine seltsame Art, eine so einfache Funktion zu implementieren.
Ich würde vermuten, dass Sie RegQueryInfoKey für diese irgendwie verwenden können, aber MSDN gibt nicht zu viele Details darüber, wie, falls es möglich ist.
Update: Ich brauche die Lösung in gerade win32 API, nicht in verwaltetem Code, .NET oder einer anderen Bibliothek.
Die docs in MSDN scheinen zu zeigen, dass Sie in der Lage sein sollte, einen Schlüssel für die Leseberechtigung zu öffnen und eine Fehlermeldung erhalten, wenn sie, wie diese nicht vorhanden ist:
lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey);
if (lResult != ERROR_SUCCESS)
{
if (lResult == ERROR_FILE_NOT_FOUND) {
jedoch
, erhalte ich ERROR_SUCCESS wenn Ich versuche das.
Update 2: Mein genauer Code ist dies:
HKEY subKey = nullptr;
LONG result = RegOpenKeyEx(key, subPath.c_str(), 0, KEY_READ, &subKey);
if (result != ERROR_SUCCESS) {
... aber Ergebnis kommt als ERROR_SUCCESS aus, auch wenn ich in einem Schlüssel gesteckt habe, der nicht existiert.
Update 3: Es sieht so aus, als ob Sie richtig sind. Dies schlägt bei einem bestimmten Testbeispiel (mysteriös) fehl. Wenn ich es auf einem anderen Schlüssel versuche, gibt es das korrekte Ergebnis zurück. Bei der doppelten Überprüfung mit dem Registrierungs-Editor wird der Schlüssel nicht angezeigt. Weiß nicht, was ich davon halten soll.
Was ist der Pfad zu dem Schlüssel, den Sie überprüfen? Ist es möglich, dass du in einen der magischen Pfade kommst, die umgeleitet werden (wie Wow6432Node)? Ich erinnere mich vage daran, dieses Problem schon einmal gesehen zu haben. Ich denke du kannst einen nicht existierenden Schlüssel öffnen. Sie erhalten einen Fehler, wenn Sie tatsächlich versuchen, einen Wert in diesem Schlüssel festzulegen oder abzufragen. –
Es könnte auch in [Registrierung VirtualStore] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa965884%28v=vs.85%29.aspx) sein. – ghord