Überprüfen ob Registry Key existiert?

2 Antworten

(...) da diese alle einen Value erfordern (...)

Hast du dir alle Methoden angeschaut? Die Methode readStringSubKeys bspw. verlangt lediglich zwei Keys und gibt dir als Ergebnis eine Map oder null zurück.

So gehts natürlich auch.

P.S.: Ansonsten müsste aber auch readString funktionieren, wenn der Name des Wertes entweder "@" oder auch einfach "" angegeben wird (bin mir da nicht 100%ig sicher, was genau in dem Fall für den "Default-Wert" verwendet wird).

0

Habs nicht getestet (dazu bräucht ich ein Windows, hab ich aber nicht), aber wenn du die folgenden Methoden hinzufügst, sollte funktionieren:

private static boolean keyExists(Preferences root, int hkey, String key) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    int[] handles = (int[]) regOpenKey.invoke(root, new Object[] { new Integer(hkey), toCstr(key), new Integer(KEY_READ) });
    if (handles[1] != REG_SUCCESS) {
        return false;
    }
    regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) });
    return true;
}

public static boolean keyExists(int hkey, String key) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    if (hkey == HKEY_LOCAL_MACHINE) {
        return keyExists(systemRoot, hkey, key);
    }
    else if (hkey == HKEY_CURRENT_USER) {
        return keyExists(userRoot, hkey, key);
    }
    if (rc != REG_SUCCESS) {
        throw new IllegalArgumentException("key=" + key);
    }
}
Woher ich das weiß:eigene Erfahrung

sollte rc nicht boolean sein?

1
@andi3366

Jep, ist mir ziemlich genau 2 Sekunden nachdem ich die Antwort abgeschickt hatte aufgefallen. Habs umgehend korrigiert. ^^;;;

1
@Isendrak

Ach verdammt! Da sind mir noch n paar Fehler aufgefallen. Ich sollte wohl doch erst dreimal nachsehen, ob ich den ganzen Kram korrekt angepasst hab... ^^;;;

So, jetzt aber:

private static int keyExists(Preferences root, int hkey, String key) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    int[] handles = (int[]) regOpenKey.invoke(root, new Object[] { new Integer(hkey), toCstr(key), new Integer(KEY_READ) });
    if (handles[1] != REG_SUCCESS) {
        return handles[1];
    }
    regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) });
    return handles[1];
}

public static boolean keyExists(int hkey, String key) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    int rc = -1;
    if (hkey == HKEY_LOCAL_MACHINE) {
        rc = keyExists(systemRoot, hkey, key);
    }
    else if (hkey == HKEY_CURRENT_USER) {
        rc = keyExists(userRoot, hkey, key);
    }
    if (rc != REG_SUCCESS && rc != REG_NOTFOUND) {
        throw new IllegalArgumentException("rc=" + rc + " key=" + key);
    }
    return rc == REG_SUCCESS;
}
1

bei rc != REG_SUCCESS was wird da vorher in rc gespeichert und das müsste dann int sein oder?

0
@andi3366

Siehe dazu meinen Kommentar zu meinem Kommentar. Ich hab da n paar "Kleinigkeiten" übersehen und die Zeit zum Bearbeiten meiner Antwort ist abgelaufen. Aber jetzt hab ichs hoffentlich.

1

Ich musste in HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft den Schlüssel Prefs erstellen, damit Preferences.userRoot() funktioniert hat. Ich dache userRoot wäre in HKEY_CURRENT_USER\Software\JavaSoft?

Wenn ich Prefs in local machine lösche funktioniert nichts mehr.

0
@andi3366

Da bin ich leider raus. Hab wie gesagt kein Windows-System um solche Dinge zu testen und hab mich auch bisher eher weniger (sprich: gar nicht) mit Java+Registry befasst.

Was evtl. gehen könnte, wäre über JNI eine in C/C++ geschriebene Bibliothek einzubinden, die als eine Art "Proxy" fungiert, allerdings beschränken sich meine Kenntnisse bzgl. JNI auf nicht viel mehr als "das existiert".

0

Was möchtest Du wissen?