Überprüfen ob Registry Key existiert?
Wie kann ich diesen Code verwenden um einfach nur zu überprüfen ob es einen Registry Key gibt? Ich finde keine einzige Methode darin, da diese alle einen Value erfordern und ich weiß nicht wie ich diese umschreiben kann.
Code: https://stackoverflow.com/questions/62289/read-write-to-windows-registry-using-java (Die erste Antwort mit 312 Upvotes)
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).
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);
}
}
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;
}
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.
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".
bei rc != REG_SUCCESS was wird da vorher in rc gespeichert und das müsste dann int sein oder?
sollte rc nicht boolean sein?