HILFE bei MS-CODE-beispiel für Joystick OEM-Name
-
Hiho
in der MSDN Lib hab ich folgende Routine für die Abfrage des Joysticknamens gefunden. Wenn ich diese allerdings benütze dann stoße ich auf folgende Fehlermeldung: EAccessValiation "Zugriffsverletzung bei Addresse xyz in der ntdll.dll"...
der Code schaut folgender Maßen aus:
#include "windows.h" #include "mmsystem.h" MMRESULT joyGetOEMProductName(UINT id, TCHAR * pszName) { JOYCAPS JoyCaps; TCHAR szKey[256]; TCHAR szValue[256]; UCHAR szOEMKey[256]; HKEY hKey; DWORD dwcb; LONG lr; // Note: JOYSTICKID1-16 is zero-based; registry entries for VJOYD are 1-based. id++; if (id > joyGetNumDevs() ) return JOYERR_NOCANDO; // Open .. MediaResources\CurentJoystickSettings. joyGetDevCaps((id-1), &JoyCaps, sizeof(JoyCaps)); sprintf(szKey, "%s\\%s\\%s", REGSTR_PATH_JOYCONFIG, JoyCaps.szRegKey, REGSTR_KEY_JOYCURR); lr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPTSTR) &szKey, 0, KEY_ALL_ACCESS, &hKey); if (lr != ERROR_SUCCESS) return JOYERR_NOCANDO; // Get OEM Key name. dwcb = sizeof(szOEMKey); sprintf(szValue, "Joystick%d%s", id, REGSTR_VAL_JOYOEMNAME); lr = RegQueryValueEx(hKey, szValue, 0, 0, (LPBYTE) &szOEMKey, (LPDWORD) &dwcb); RegCloseKey(hKey); if (lr != ERROR_SUCCESS) { *pszName = 0; return JOYERR_NOCANDO; } // Open OEM Key from ...MediaProperties. sprintf(szKey, "%s\\%s", REGSTR_PATH_JOYOEM, szOEMKey); lr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKey, 0, KEY_ALL_ACCESS, &hKey); if (lr != ERROR_SUCCESS) return JOYERR_NOCANDO; // Get OEM Name. dwcb = sizeof(szValue); lr = RegQueryValueEx( hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, (LPBYTE) pszName, (LPDWORD) &dwcb); RegCloseKey(hKey); if (lr != ERROR_SUCCESS) return JOYERR_NOCANDO; else return JOYERR_NOERROR; }Der Pointer steht dabei auf lr = RegQueryValueEx( hKey, REGSTR_VAL_JOYOEMNAME, 0 ,0 , (LPBYTE) pszName, (LPDWORD) &dwcb); Befehl steht 10 Stellen vor Code Ende.
?!?
Gruß
-
wenn der code von ms ist, denke ich dass er ok ist. wwie rufst du das auf und bitte mehr als nur die eine zeile jetzt posten
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ich denke es liegt daran, dass der Parameter pszName nicht ordentlich ist, z.B. NULL oder zu klein.
-
Evtl. geht der sprintf vorher schief. Dir ist klar, dass Du hier den Speciher von 256 Zeichen evtl. überschreitest.
BTW: Dein Code wird unter Vista nicht funktionieren.
Unter HKLM kannst Du nur als Prozess mit Admin Rechten einen Pfad mit KEY_ALL_ACCESS öffnen. Unter W2K+XP wird Dein Code nur als Admin laufen.
-
Martin Richter schrieb:
BTW: Dein Code wird unter Vista nicht funktionieren.
Unter HKLM kannst Du nur als Prozess mit Admin Rechten einen Pfad mit KEY_ALL_ACCESS öffnen. Unter W2K+XP wird Dein Code nur als Admin laufen.Darf ich fragen was es für sinnige Alternativen gäbe?
EDIT: Mir ist eben der Link zum o.g. script in die Hände gefallen:
http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dnargame/html/msdn_sidewind3d.aspViele Grüße
vizArt
-
Hiho,
ich habe festgestellt das in der besagten Zeile das & bei (LPBYTE) &pszName, gefehlt hat.
Nun kann ich den Code ausführen doch bekomm ich keinen Wert zurückgeliefert wenn ich wie Folgt abfrage.
char *test;
joyGetOEMProductName(1, test);
Label2->Caption = test;
-
MMRESULT joyGetOEMProductName(UINT id, TCHAR *pszName) { JOYCAPS JoyCaps; TCHAR szKey[256]; TCHAR szValue[256]; UCHAR szOEMKey[256]; UCHAR pszOEMKey[256]; HKEY hKey; DWORD dwcb; LONG lr; // Note: JOYSTICKID1-16 is zero-based; registry entries for VJOYD are 1-based. id++; if (id > joyGetNumDevs() ) return JOYERR_NOCANDO; // Open .. MediaResources\CurentJoystickSettings. joyGetDevCaps((id-1), &JoyCaps, sizeof(JoyCaps)); sprintf(szKey, "%s\\%s\\%s", REGSTR_PATH_JOYCONFIG, JoyCaps.szRegKey, REGSTR_KEY_JOYCURR); lr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPTSTR) &szKey, 0, KEY_ALL_ACCESS, &hKey); if (lr != ERROR_SUCCESS) return JOYERR_NOCANDO; // Get OEM Key name. dwcb = sizeof(szOEMKey); sprintf(szValue, "Joystick%d%s", id, REGSTR_VAL_JOYOEMNAME); lr = RegQueryValueEx(hKey, szValue, 0, 0, (LPBYTE) &szOEMKey, (LPDWORD) &dwcb); RegCloseKey(hKey); if (lr != ERROR_SUCCESS) { *pszName = 0; return JOYERR_NOCANDO; } // Open OEM Key from ...MediaProperties. sprintf(szKey, "%s\\%s", REGSTR_PATH_JOYOEM, szOEMKey); lr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKey, 0, KEY_ALL_ACCESS, &hKey); if (lr != ERROR_SUCCESS) return JOYERR_NOCANDO; // Get OEM Name. dwcb = sizeof(szValue); lr = RegQueryValueEx( hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, (LPBYTE) &pszOEMKey, (LPDWORD) &dwcb); RegCloseKey(hKey); sprintf(pszName, "%s", pszOEMKey); if (lr != ERROR_SUCCESS) return JOYERR_NOCANDO; else return JOYERR_NOERROR; }so ich habs jetzt selbst folls geschafft... man sollte meinen wenn man sich solche Code Beispiele holt, dass diese dann auch funktionieren...aber anscheinend ist das wohl nicht so der fall... naja... auf jeden fall klappts nun.
Danke @ all
-
Da Du nicht Schreiben willst genügt doch ein KEY_ACCESS_READ!
-
Martin Richter schrieb:
Da Du nicht Schreiben willst genügt doch ein KEY_ACCESS_READ!
Danke für Deine Antwort

-
@Magge2k: also irgendwie seltsam. Dein Code weicht im letzten Bereich vom Original MS-Code ab. Vergleich mal Dein Code mit dem: http://msdn.microsoft.com/archive/en-us/dnargame/html/msdn_sidewind3d.asp . Dieser hat nach dem Ersetzten von: KEY_ACCESS_READ in KEY_READ einwandfrei funktioniert.
Viele Grüße
vizArt