Probleme mit Zugriffssteuerung auf Registry-Keys
Verfasst: 08.10.2010 22:52
Aufgrund mehrerer Hinweise im PureBasic-Forum kann ich meine Joysticks über die WINMM.DLL mit den API-Funktionen 'joyGetNumDevs', 'joyGetDevCaps' und 'joyGetPosEx' abfragen. Leider steht in dem JOYCAPS-Feld 'Pname' statt der Joystick-Bezeichnung immer nur 'Microsoft-PC-Joysticktreiber'. Da ich aber auch die Joystick-Bezeichnung haben wollte, habe ich mit 'RegEdt32.exe' nach einer Möglichkeit gesucht, den Joystick-Namen zu ermitteln.
Diese Möglichkeit besteht über die Mid- und Pid-Felder der JOYCAPS Struktur. Wenn man diese Felder zu einem String:
verbindet, hat man einen zum Joystick gehörenden Registry-Key, mit dem man den 'OEMName' abfragen kann. Ich habe dazu den Hauptschlüssel HKEY_LOCAL_MACHINE und folgenden Sub-Key verwendet:
Testweise habe ich 3 verschiedene Joysticks (Logitech Force 3D Pro, Saitec X52 Flight Controller und Speed-Link Competition Pro) gleichzeitig angeschlossen. Unter den generierten Registry-Keys werden mir auch die jeweiligen Joystick-Namen von 'RegEdt32.exe' angezeigt.
Im PureBasic-Programm bekomme ich den Namen des Logitech-Joysticks aber nur angezeigt, wenn ich bei der API-Funktion 'RegOpenKeyEx' das Flag #KEY_READ benutze. Will ich den Saitek-Joystick-Namen auslesen, muß ich das Flag #KEY_ALL_ACCESS benutzen. Für den Speed-Link Joystick muß das Flag #KEY_QUERY_VALUE verwendet werden. Mit keinem der einzelnen Flags (oder einer Kombination) bekomme ich alle 3 Joystick-Namen angezeigt. Offenbar liegt das an unterschiedlichen Berechtigungen der Registry-Keys. Die spezialisierten Abfragen reichen zwar für meine 3 Joysticks (ich rufe einfach alle 3 Fälle auf), es ist aber etwas unbefriedigend, da ich das gerne für den allgemeinen Fall gelöst hätte.
Meine Frage ist: Kann mir da jemand einen Tipp geben, wie man das allgemein oder besser oder auch ganz anders löst?
Anmerkung: Ich habe mir auch die offenbar neuere API-Funktion 'RegGetValueA' der ADVAPI32.DLL zugänglich gemacht (statt der Folge RegOpenKeyEx, RegQueryValueEx, RegCloseKey). Auch die verhält sich ähnlich und liefert (erwartungsgemäß) nicht für alle Joysticks die Namen.
Diese Möglichkeit besteht über die Mid- und Pid-Felder der JOYCAPS Struktur. Wenn man diese Felder zu einem String:
Code: Alles auswählen
VID_PID_Id = "VID_" + RSet(Hex(JoyStickCaps\Mid,#PB_Word),4,"0") + "&PID_" + RSet(Hex(JoyStickCaps\Pid,#PB_Word),4,"0")
;dabei ist JoyStickCaps mein JOYCAPS-Feld
Code: Alles auswählen
SubKey = "SYSTEM\CurrentControlSet\Control\MediaProperties\PrivateProperties\Joystick\OEM\" + VID_PID_Id
Im PureBasic-Programm bekomme ich den Namen des Logitech-Joysticks aber nur angezeigt, wenn ich bei der API-Funktion 'RegOpenKeyEx' das Flag #KEY_READ benutze. Will ich den Saitek-Joystick-Namen auslesen, muß ich das Flag #KEY_ALL_ACCESS benutzen. Für den Speed-Link Joystick muß das Flag #KEY_QUERY_VALUE verwendet werden. Mit keinem der einzelnen Flags (oder einer Kombination) bekomme ich alle 3 Joystick-Namen angezeigt. Offenbar liegt das an unterschiedlichen Berechtigungen der Registry-Keys. Die spezialisierten Abfragen reichen zwar für meine 3 Joysticks (ich rufe einfach alle 3 Fälle auf), es ist aber etwas unbefriedigend, da ich das gerne für den allgemeinen Fall gelöst hätte.
Meine Frage ist: Kann mir da jemand einen Tipp geben, wie man das allgemein oder besser oder auch ganz anders löst?
Anmerkung: Ich habe mir auch die offenbar neuere API-Funktion 'RegGetValueA' der ADVAPI32.DLL zugänglich gemacht (statt der Folge RegOpenKeyEx, RegQueryValueEx, RegCloseKey). Auch die verhält sich ähnlich und liefert (erwartungsgemäß) nicht für alle Joysticks die Namen.