DirectInput SetDataFormat错误

时间:2014-04-09 05:18:37

标签: directinput

我想编写一个与游戏杆交互的程序。我正在使用标准SDK示例和dinput8.lib。

这是代码。 GUID取自enumJoysticksCallback函数。我扔掉了所有东西,以尽量减少出错的可能性。

LPDIRECTINPUT8          g_pDI = NULL;
LPDIRECTINPUTDEVICE8    g_pJoystick = NULL;

HRESULT hr = DirectInput8Create ( GetModuleHandle( NULL ), DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pDI, NULL );

    GUID  *GUID_Saitek = new _GUID ;
    GUID_Saitek->Data1 = 0xA00DBD70;
    GUID_Saitek->Data2 = 0x7FB5;
    GUID_Saitek->Data3 = 0x11E3;
    char tmp[8] = { 0x80, 0x3, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0 };
    memcpy(GUID_Saitek->Data4, tmp, 8);

    g_pDI->CreateDevice( *GUID_Saitek, &g_pJoystick, NULL );
    hr = g_pJoystick->SetDataFormat( &c_dfDIJoystick2 ) ;

程序在此字符串上失败

hr = g_pJoystick->SetDataFormat( &c_dfDIJoystick2 );

hr返回0x80070216,这似乎是ERROR_ARITHMETIC_OVERFLOW。

& c_dfDIJoystick而不是& c_dfDIJoystick2也没有帮助。

鼠标是一样的......

LPDIRECTINPUT8          di = NULL;
LPDIRECTINPUTDEVICE8    Mouse = NULL;
HRESULT hr = DirectInput8Create(GetModuleHandle( NULL ),  DIRECTINPUT_VERSION, IID_IDirectInput8,  (VOID**)&di, NULL);
hr = di->CreateDevice( GUID_SysMouse, &Mouse, NULL );
hr = Mouse->SetDataFormat( &c_dfDIMouse ) ;

hr再次返回0x80070216 示例应用程序" Joystick.exe"没问题。

GetCapabilities返回一些肯定不正确的随机内容

  • Embarcadero RAD Studio XE5 / Borland CPP Builder 6(两者都有相同 结果)
  • DirectInput Saitek Rudder踏板/ Saitek X52控制器(均为 崩溃计划)
  • 32位应用
  • 标准SDK示例"操纵杆"

有什么问题?错误与directinput相关的任何内容都不匹配。设备创建时没有错误,但任何使用它的工作都会导致错误。

谢谢!

UPDATE:SetCooperativeLevel函数返回0x80070006,即ERROR_INVALID_HANDLE

1 个答案:

答案 0 :(得分:0)

最后我发现了问题所在。它在这里撒谎:& c_dfDIJoystick2

由于某些原因,Microsoft附加了与anythig不匹配的预定义结构。甚至& c_dfDIMouse与我的简单3键鼠标不匹配。 答案来自另一个示例代码“自定义格式”。 你必须为每个设备创建一个新的格式结构,因为即使是EnumObjects函数也不会为你创建,这使得DirectInput非常不方便。