[c++, DirectInput] Probleme beim Initialisieren von ForceFeedback-Joysticks

Pendergast

Erfahrenes Mitglied
Servus,

ich kämpf mich gerade durch die DirectInput-Tutorials. Mein Auftrag bzw. Wunsch: Einen ForceFeedback-Joystick zu einem simplenKraftakt nötigen.

Allerdings scheitere ich schon ziemlich am Anfang beim Übergang von Step 1 zu Step 2. Ich bekomme den Fehler 'IDirectInput8A::EnumDevices': Konvertierung des Parameters 2 von 'BOOL (LPCDIDEVICEINSTANCE,LPVOID)' in 'LPDIENUMDEVICESCALLBACKA' nicht möglich. zurück, wo ich als C++-Neuling leider aussteigen muss.

Mein Code folgt, die Fehlerquelle in CManager.cpp, Methode starteAnwendung() habe ich markiert.

Fänd ich klasse, wenn mir jemand einen Schubs in die richtige Richtung geben könnte, ich weiß nicht wo mein Fehler liegt - hab mich doch eigentlich an das Tutorial gehalten.


CManager.h
Code:
#pragma once

#define DIRECTINPUT_VERSION 0x0800

#include <dinput.h>
#pragma comment (lib, "dinput8.lib")
#pragma comment (lib, "dxguid.lib")
#include <windows.h>
#include <iostream>
using namespace std;

class CManager
{
public:
	CManager(void);
	~CManager(void);
	void starteAnwendung(void);
private:
	BOOL CALLBACK DIEnumDevicesProc(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef);
	HINSTANCE m_hinstance;
	LPDIRECTINPUT8 m_lpDI;
	LPDIRECTINPUTDEVICE8 m_lpDIDevice;
};

CManager.cpp
Code:
#include ".\manager.h"

// ...

void CManager::starteAnwendung(void)
{
	HRESULT hr;

	m_hinstance = GetModuleHandle(NULL);

	hr = DirectInput8Create(m_hinstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&m_lpDI, 0); 
	if FAILED(hr) 
	{ 
                // ...
	}

//
// in der nächsten Zeile taucht der Fehler auf
//
	hr = m_lpDI->EnumDevices(DI8DEVCLASS_GAMECTRL, DIEnumDevicesProc, NULL, DIEDFL_FORCEFEEDBACK | DIEDFL_ATTACHEDONLY);
	if FAILED(hr)
	{
                // ...
	}
}

BOOL CALLBACK DIEnumDevicesProc(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef)
{
    HRESULT hr;
    GUID DeviceGuid = lpddi->guidInstance;

    // Create game device.
 
    hr = g_lpDI->CreateDevice(DeviceGuid, &g_lpDIDevice, NULL); 

    if (FAILED(hr))
        // Continue enumerating until successful or finished
        return DIENUM_CONTINUE;
 
    // Set cooperative level.
    hr = g_lpDIDevice->SetCooperativeLevel(g_hwndMain,
                                  DISCL_EXCLUSIVE | DISCL_FOREGROUND);
    if (FAILED(hr))
        return hr;

    // set game data format
    hr = g_lpDIDevice->SetDataFormat(&c_dfDIJoystick);
    if (FAILED(hr))
        return hr;
 

    DIPROPDWORD DIPropAutoCenter;

    DIPropAutoCenter.diph.dwSize       = sizeof(DIPropAutoCenter);
    DIPropAutoCenter.diph.dwHeaderSize = sizeof(DIPROPHEADER);
    DIPropAutoCenter.diph.dwObj        = 0;
    DIPropAutoCenter.diph.dwHow        = DIPH_DEVICE;
    DIPropAutoCenter.dwData            = DIPROPAUTOCENTER_OFF;

    hr = g_lpDIDevice->SetProperty(DIPROP_AUTOCENTER, 
                                   &DIPropAutoCenter.diph);
    if (FAILED(hr))
    {
        // Handle the failure as appropriate
    }

    return DIENUM_STOP;   // One is enough.
}
 
Zuletzt bearbeitet:
Zurück