DirectInput Problem



  • Hi,
    habe zwei Routinen für directInput geschrieben. Die eine initialisiert DirectInput:

    void InitDirectInput(void)
    {
    	if(FAILED(DirectInput8Create(hInst, DIRECTINPUT_VERSION, 
                                     IID_IDirectInput8,(void**)&lpDI,NULL)))
        { 
            MessageBox(hWnd,"Fehler beim Anlegen des DirectInput8-Objekts","Fehler",MB_OK);
        } 
    
        if(FAILED(lpDI->CreateDevice(GUID_SysKeyboard, &lpDIKeyboard, NULL)))
        {
            MessageBox(hWnd,"Fehler beim Anlegen des Tastatur-Geräts","Fehler",MB_OK);
        }
    
        if(FAILED(lpDIKeyboard->SetDataFormat(&c_dfDIKeyboard)))
        {
            MessageBox(hWnd,"Fehler beim Setzen des Datenformats","Fehler",MB_OK);
        }
    
        if(FAILED(lpDIKeyboard->SetCooperativeLevel(hWnd,DISCL_FOREGROUND | 
                                                         DISCL_NONEXCLUSIVE)))
        {    
            MessageBox(hWnd,"Fehler beim Setzen des Kooperationsebene (DirectInput)","Fehler",MB_OK);
        }
    
        lpDIKeyboard->Acquire();
    }
    

    So die Routine funktioniert auch einwandfrei. Keine Fehlermeldung oder sonst etwas in der Art.

    Dann habe ich noch eine Routine, die feststellen soll, ob die linke Pfeiltaste gedrückt wurde:

    void GetKeyboardKey(void)
    {
    	byte keys[256]; 
    
    	ZeroMemory( &keys, sizeof(keys) );
    
    	if(FAILED(lpDIKeyboard->GetDeviceState(sizeof(keys), (LPVOID)&keys))) 
        { 
            lpDIKeyboard->Acquire();
            return;
        } 
    
        if(bKeyboard[DIK_LEFT])
        {
            ClearDirect3D();
        }
    }
    

    Compiler und Linker geben hier ebenfalls keine Fehlermeldung aus, aber wenn ich das Programm starte und an die Stelle komme, an der GetKeyboardKey() aufgerufen wird, meldet sich Visual Studio mit folgender Meldung:

    Unhandled exception at 0x00439892 in DIRECTXGRAPHICS.exe: 0xC0000005: Access violation reading location 0x00000000.

    und zeigt dabei auf die Zeile:

    if(FAILED(lpDIKeyboard->GetDeviceState(sizeof(keys), (LPVOID)&keys))) 
        { 
            lpDIKeyboard->Acquire();
            return;
        }
    

    Was habe ich falsch gemacht? Verwende Visual Studio 2005 Pro, aktuelle SDK, und alle Libs und Header sind korrekt eingebunden.



  • byte keys[256];
    
        ZeroMemory( &keys, sizeof(keys) );
    
        if(FAILED(lpDIKeyboard->GetDeviceState(sizeof(keys), (LPVOID)&keys)))
        {
            lpDIKeyboard->Acquire();
            return;
        }
    

    hat nichts mit DI zu tun,k wie ich das sehe :)... liegt an dir.

    keys ist ein zeiger auf dein Array. &keys is die Adresse des zeigers auf dein Array. Weiterhin würde ich nich empfhlen sizeof(keys) zu nehmen, denn wenn keys dynamisch mit new angefordert wurde geht das nich. Mach lieber 256*sizeof(byte).

    aso, dein Fehler liegt hier:
    ZeroMemory(&keys, ...);
    damit biegst du den zeiger um, und änderst nicht den inhalt des arrays.
    muss heien

    ZeroMemory(keys, sizeof(char)*256);



  • habe ich jetzt alles so geändert, aber VS meldet sich trotzdem immer noch mit der selben Meldung, wenn das Programm an die Stelle kommt....



  • Das light wohl beim ZeroMemory-Aufruf, da du die Addresse der Addresse des Arrays angibst!
    Korrekt heißt es:

    ZeroMemory(keys, sizeof(BYTE[256]));
    

    Oder aber der Zeiger auf das DI-Device ist null.



  • Hum...also ich habs mit einer IF-Abfrage getestet, lpDIKeyboard ist wirklich NULL. Aber warum? ich habe doch ein Routine (s.o.) die alles initialisiert und die rufe ich ja auch vorher auf, ohne dass Fehler auftreten. Also warum ist das Ding dann NULL?


  • Mod

    step doch mit dem debugger durch statt if abfragen fuer sowas zu machen. schau dir die stelle an an der du den pointer setzt (im debugger), dann weisst du sicherlich ganz schnell was schief geht. unser raten hier ist sehr uneffektiv 😉


Log in to reply