2009-08-27 27 views
7

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.

+4

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. –

+1

Es könnte auch in [Registrierung VirtualStore] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa965884%28v=vs.85%29.aspx) sein. – ghord

Antwort

7

Vor allem mach dir keine Sorgen über die Leistung für solche Sachen. Wenn Sie es nicht 100x pro Sekunde abfragen, ist es mehr als schnell genug. Vorzeitige Optimierung wird Ihnen alle Arten von Kopfschmerzen verursachen.

RegOpenKeyEx gibt ERROR_SUCCESS zurück, wenn es den Schlüssel findet. Passen Sie einfach auf diese Konstante und Sie sind gut zu gehen.

+1

Nun, dies ist nicht so sehr eine vorzeitige Optimierung, als dass man dem Code nicht diese Komplexität hinzufügen möchte. – slicedlime

4

RegOpenKey gibt einen Fehler zurück, wenn der Schlüssel nicht existiert. Wie benutzt du es? Der erwartete Rückgabewert ist ERROR_FILE_NOT_FOUND.

aus dem Code:

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

I auf den Wert von key aussehen würde und subPath und stellen Sie sicher, sie sind, was Sie erwarten, und dass der Schlüssel nicht wirklich existieren. Was ist der Wert von subKey danach? Es öffnet offensichtlich etwas - versuchen Sie es aufzuzählen, um zu sehen, was die Schlüssel und Werte darunter sind.

Es gibt kein Problem mit RegOpenKey keinen Fehler zurückgegeben, wenn der Schlüssel nicht existiert - ich würde nicht versuchen, davon auszugehen, dass es irgendeine Art von seltsamen OS-Bug in etwas wie die Registrierung üblich ist.

Möglicherweise haben Sie einen Registrierungsschlüssel, der für Sie nicht sichtbar ist, der Benutzer, der den Registrierungs-Editor ausführt, aber nicht Ihren Code? Ein Berechtigungsproblem vielleicht? Wird Ihr Code in Windows Vista oder Server 2008 als erhöhter Benutzer ausgeführt? Haben Sie versucht, den Registrierungseditor als Administrator auszuführen?

+0

Sie können auch ERROR_PATH_NOT_FOUND erhalten –

0

Beachten Sie, dass neben den "Kern" -Registrierungsfunktionen, die mit "Reg" beginnen, auch Hilfsfunktionen vorhanden sind, die mit "SHReg" beginnen. Diese sind für use by the Shell d. H. Explorer gedacht, sind jedoch dokumentiert und können auch in normalen Anwendungen verwendet werden. Sie sind in der Regel dünne Wrapper, die einige allgemeine Aufgaben erleichtern. Sie sind Teil der "Shell LightWeight API" (shlwapi.dll)

Verwandte Themen