Absturz beim Acquirieren der Maus mit DirectInput

UncleBob

Mitglied
Ich habe jetzt ziemlich lange rum geübt, bin mit meinem Latein am Ende. Aber das bin ich ohnehin recht schnell. Ich erhalte einen Absturz beim Acquirieren der Maus mit DirectX. Die Fehlermeldung lautet folgendermassen:

Unhandled exception at 0x0043341f in SpaceEngine.exe: 0xC0000005: Access violation reading location 0x00000000.

Ein Speicherfehler also, und mit denen bin ich sowieso nicht so bewandert. Grundsätzlich habe ich mit mehreren Samples und anderem Code verglichen, komme aber einfach nicht dahinter was falsch läuft. Hier ist der Code:

Header:

Code:
#pragma once

#include <dinput.h>

class DXInput
{
public:
	DXInput(void);
	~DXInput(void)
	{
		DI_Term();
	}

	void DI_Term();
        HRESULT DI_Init( HWND hDlg );
        DIMOUSESTATE GetMouseState();

private:
IDirectInput*           g_pDI;
IDirectInputDevice*     g_pMouse;
HINSTANCE               g_hInst;
BOOL                    g_bActive;
DIMOUSESTATE MouseData;
DWORD dwNumElements;
};

Source:

Code:
#include "DXInputM.h"

DXInput::DXInput(void)
{
}

HRESULT DXInput::DI_Init( HWND hDlg )
{
    HRESULT hr;

    hr = DirectInputCreate( g_hInst, DIRECTINPUT_VERSION, &g_pDI, NULL );
    if ( FAILED(hr) ) 
        return hr;

    hr = g_pDI->CreateDevice( GUID_SysMouse, &g_pMouse, NULL );
    if ( FAILED(hr) ) 
        return hr;

    hr = g_pMouse->SetDataFormat( &c_dfDIMouse );
    if ( FAILED(hr) ) 
        return hr;

    hr = g_pMouse->SetCooperativeLevel( hDlg, DISCL_EXCLUSIVE | DISCL_FOREGROUND);
    
	HANDLE hevtMouse = CreateEvent( 0, 0, 0, 0);
	hr = g_pMouse->SetEventNotification(hevtMouse);

//Wenn ich die Maus hier Acquiriere erfolgt noch kein Absturz

	memset(&MouseData, 0, sizeof(DIDEVICEOBJECTDATA));
	dwNumElements = 1;

	if ( FAILED(hr) ) 
        return hr;

    return S_OK;
}

DIMOUSESTATE DXInput::GetMouseState()
{
	HRESULT hr;

	if( g_pMouse->GetDeviceState( sizeof(DIMOUSESTATE), &MouseData) == DIERR_INPUTLOST)  //hier kommt der Crash
	{
		if( g_pMouse->Acquire() == DI_OK)
			hr = g_pMouse->GetDeviceState( sizeof(DIMOUSESTATE), &MouseData);
	}
	return MouseData;
}

void DXInput::DI_Term()
{
    if (NULL != g_pMouse) 
    {
        g_pMouse->Unacquire();  

        g_pMouse->Release();
        g_pMouse = NULL;
    }

    if (NULL != g_pDI) 
    {
        g_pDI->Release();
        g_pDI = NULL;
    }
}

Wäre echt toll wenn mir jemand aus der Patsche helfen könnte... Wenns um Speicherkonflikte geht weiss ich meistens nicht mehr aus noch ein.
 
Zuletzt bearbeitet:
Ok, ich habe DirectInput mal DirectInput sein lassen, weil man mir andernorts gesagt hat das die WinAPI grundsätzlich einfacher zu bedienen ist und eigentlich keine Nachteile hat.

Soweit so gut, das klappt jetzt eigentlich auch, aber jetzt kriege ich Probleme mit dem Mousewheel. Da war natürlich erst das Problem das WM_MOUSEWHEEL nicht bekannt war, also habe ich ein wenig gegoogelt und meinen Header mit dem folgenden ergänzt:

#ifndef WM_MOUSEWHEEL
#define WM_MOUSEWHEEL 0x020A
#endif

Nun funktioniert das aber immer noch nicht, wenn auch aus anderen Gründen. Ich bekomme einen Linker-error:

Code:
1>rmbegin1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""long __stdcall WindowFunc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowFunc@@YGJPAUHWND__@@IIJ@Z)" in Funktion ""struct HWND__ * __cdecl InitApp(struct HINSTANCE__ *,int)" (?InitApp@@YAPAUHWND__@@PAUHINSTANCE__@@H@Z)".

Ich habe dann noch die User32.lib zu den Bibliotheken hinzugefügt, aber das Problem bleibt. Mein System ist zugegebenermassen etwas alt (Win2k), aber das müsste doch zum laufen kriegen sein?

Ich habe auch versucht _WIN32_WINNT anders zu definieren, aber es kommt dieselbe Fehlermeldung raus. fehlt mir irgendeine Bibliothek?
 
Zurück