German Falscher Wert bei Reg.GetInt und Reg.GetValue

Amalkotey

Active Member
Licensed User
Longtime User
Hallo,

ich versuche mittels der Registry-Lib den Wert aus dem Schlüssel

B4X:
HKCU\ControlPanel\Volume\Volume

auszulesen. Statt den gespeicherten Wert erhalte ich aber -1 als Ergebnis. Mit den Nachfolgenden Codezeilen wird der Wert ausgelesen:

B4X:
Reg.RootKey(Reg.rtCurrentUser)
Value = Reg.GetValue("ControlPanel\Volume", "Volume")   ' Value = Reg.GetInt("ControlPanel\Volume", "Volume")

Weiß jemand wo der Fehler ist?

Viele Grüsse
Amalkotey
 
Last edited:

specci48

Well-Known Member
Licensed User
Longtime User
Weiß jemand wo der Fehler ist?
Wenn man ehrlich ist ... in der Dll selbst ...

Laut Hilfe liefert getValue folgendes:

GetValue can return four different types of data:
String - If the value is of type REG_SZ.
Integer - If the value is of type REG_DWORD
Bytes Array - If the value is of type REG_BINARY.
String Array - If the value is of type REG_MULTI_SZ.

Der Volume-Eintrag in der Registry ist vom Typ REG_DWORD, wird durch die Dll leider als Integer (konkret vom Type Int32) zurückgegeben. Der Befehl getInt gibt auch nur einen Wert vom Typ Int32 zurück. Somit sind große Volume Werte nicht korrekt ermittelbar.

Deutlich wird das ganze, wenn Du den Wert bei verschiedenen Lautstärken ausliest:
- stellst Du Deinen PDA stumm, gibt es den richtigen Wert 0.
- stellst Du Deinen PDA auf minimale Lautstärke, gibt es auch einen richtigen Wert
- stellst Du die Lautstärke immer höher, dann wird der ausgelesene Wert irgendwann negativ (durch die Int32-Konvertierung)
- und irgendwann (bei mir z.B. bei voller Lautstärke) wird daraus eine -1

Leider habe ich auch keine Lösung parat, wie man den Eintrag immer korrekt erhält. Ggf. sollten wir mal Erel fragen, ob er den Rückgabewert in der Dll z.B. auf einen Int64 ändern kann.


specci48
 

Amalkotey

Active Member
Licensed User
Longtime User
qSpeccie48:

Ja du hast recht. Ich habe mir mal die RegistryDevice.cs angeschaut. Ich dachte Erel macht hier einen Cast. Weit gefehlt, er holt die Daten aus einem Buffer-String, welche mit einer Bitconvertierung nach Int32 durchführt.

Ich habe mir jetzt was anderes einfallen lassen. Der Wert für die Lautstärke wird aus durch

B4X:
HKCU\ControlPanel\SoundCategories\System\InitVol

Dieser Wert erfaßt die 6 Zuständer der Lautstärke, welche ich jetzt Abfrage. Beim Verändern der Lautstärke kann ich ohne Probleme dem Wert in

B4X:
HKCU\ControlPanel\Volume\Volume

schreiben. vielen Dank für Deine Hilfe.

Gruss
Amalkotey
 
Top