Se connecter / S'enregistrer
Votre question

Problème DirectInput!

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
8 Février 2009 22:46:58

Bonjour,

Je viens de m'initier à DirectInput pour gérer les évènements du clavier et de la souris et j'ai suivi un petit tuto. Mais je me trouve en face d'un problème très bizarre...

L'appel de la fonction Acquire() provoque des anomalie dans une librairie dll liée à mon exe. Celle-ci connaissait l'addresse d'une variable de mon executable pour y accéder et l'oublie si je fait un appel à la fonction Acquire() ce qui plante mon programme. Et je ne vois pas le liens entre ce pointeur et les fonctions de DirectX Oo.

En retirant le plus de code possible pour m'axer sur les inputs je me suis rendu compte que cette fonction ne renvoit un DI_OK (succès) que lors de son premier appel, enfsuis j'ai droit à un S_FALSE.

Voici le code des 2 fonctions qui gèrent les inputs, celle qui l'initialise, après la création de la fenêtre. Et celle qui détecte les évènements, dans la boucle principale:

  1. bool CreateInputInterface( HINSTANCE hInstance )
  2. {
  3. // Create the input interface
  4. if ( DirectInput8Create( hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void **)&gAF.pDxInputs, NULL ) != DI_OK )
  5. return false;
  6.  
  7. if ( !gAF.pDxInputs )
  8. return false;
  9.  
  10. // Create the keyboard device
  11. if ( gAF.pDxInputs->CreateDevice( GUID_SysKeyboard, &gAF.pDxKeyboard, NULL ) != DI_OK )
  12. return false;
  13.  
  14. // Create the mouse device
  15. if ( gAF.pDxInputs->CreateDevice( GUID_SysMouse, &gAF.pDxMouse, NULL ) != DI_OK )
  16. return false;
  17.  
  18. if ( !gAF.pDxKeyboard || !gAF.pDxMouse )
  19. return false;
  20.  
  21. // Set the data format for keyboard and mouse
  22. if ( gAF.pDxKeyboard->SetDataFormat( &c_dfDIKeyboard ) != DI_OK )
  23. return false;
  24.  
  25. if ( gAF.pDxMouse->SetDataFormat( &c_dfDIMouse ) != DI_OK )
  26. return false;
  27.  
  28. // Set the control that will have over the keyboard
  29. if ( gAF.pDxKeyboard->SetCooperativeLevel( gAF.hWndScreen, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND ) != DI_OK )
  30. return false;
  31.  
  32. // Set the control that will have over the mouse
  33. if ( gAF.pDxMouse->SetCooperativeLevel( gAF.hWndScreen, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND ) != DI_OK )
  34. return false;
  35.  
  36. return true;
  37. }
  38.  
  39. void UpdateInput( void )
  40. {
  41. char KeyboardState[ KEYBOARD_BUFFER ];
  42.  
  43. DIMOUSESTATE MouseState;
  44.  
  45. // Get keyboard state
  46. if ( gAF.pDxKeyboard->Acquire() == DI_OK )
  47. {
  48. if ( gAF.pDxKeyboard->GetDeviceState( KEYBOARD_BUFFER, (void *)KeyboardState ) == DI_OK )
  49. {
  50. if ( KeyboardState[ DIK_F12 ] & 0x80 )
  51. Exit();
  52.  
  53. if ( KeyboardState[ DIK_RETURN ] & 0x80 )
  54. gInputs.fPressedEnter = true;
  55. else
  56. gInputs.fPressedEnter = false;
  57.  
  58. if ( KeyboardState[ DIK_ESCAPE ] & 0x80 )
  59. gInputs.fPressedEscape = true;
  60. else
  61. gInputs.fPressedEscape = false;
  62. }
  63. }
  64.  
  65. Int32u iMouseFlags = 0;
  66.  
  67. // Get mouse state
  68. if ( gAF.pDxMouse->Acquire() == DI_OK )
  69. {
  70. if ( gAF.pDxMouse->GetDeviceState( sizeof( DIMOUSESTATE ), (void *)&MouseState ) == DI_OK )
  71. {
  72. // Get left button state
  73. if ( MouseState.rgbButtons[ 0 ] & 0x80 )
  74. {
  75. if ( !( gInputs.iMouseFlags & MOUSE_LEFTBUTTONPRESSED ) )
  76. iMouseFlags |= MOUSE_LEFTBUTTONDOWN;
  77.  
  78. iMouseFlags |= MOUSE_LEFTBUTTONPRESSED;
  79. }
  80. else if ( gInputs.iMouseFlags & MOUSE_LEFTBUTTONPRESSED )
  81. {
  82. iMouseFlags |= MOUSE_LEFTBUTTONUP;
  83. }
  84.  
  85. // Get right button state
  86. if ( MouseState.rgbButtons[ 1 ] & 0x80 )
  87. {
  88. if ( !( gInputs.iMouseFlags & MOUSE_RIGHTBUTTONPRESSED ) )
  89. iMouseFlags |= MOUSE_RIGHTBUTTONDOWN;
  90.  
  91. iMouseFlags |= MOUSE_RIGHTBUTTONPRESSED;
  92. }
  93. else if ( gInputs.iMouseFlags & MOUSE_RIGHTBUTTONPRESSED )
  94. {
  95. iMouseFlags |= MOUSE_RIGHTBUTTONUP;
  96. }
  97.  
  98. // Get mouse position
  99. gInputs.iMouseX += MouseState.lX;
  100. gInputs.iMouseY += MouseState.lY;
  101. }
  102. }
  103.  
  104. gInputs.iMouseFlags = iMouseFlags;
  105. }


Merci de m'aider, seul je n'y arrive pas!

Autres pages sur : probleme directinput

a b L Programmation
9 Février 2009 21:56:04

Et en forground au lieu de background, c'est pareil ?
Et en enlevant la souris ?
m
0
l
9 Février 2009 22:20:37

Oui pareil ça ne change rien :( 
m
0
l
Contenus similaires
a b L Programmation
10 Février 2009 22:15:12

Je ne vois pas ce qui pose problème dans le programme.
Si tu compiles en Release, est-ce que ça marche sur un autre PC?
m
0
l
20 Février 2009 12:56:09

Je ne sais pas je n'ai pas essayé, mais ça doit pouvoir fonctionner sur mon PC. Ce qui me turlupine surtout c'est que l'appel d'une fonction viennent créer des erreurs sur une partie complètement indépendante!
m
0
l
a b L Programmation
20 Février 2009 20:38:06

Oui, mais DirectX fonctionne par composants (au sens COM/DCOM). Donc, si tu penses utiliser une version et que tu en utilises une autre, ça peut poser problème.
m
0
l
28 Février 2009 18:18:22

Je pense utiliser la version de direct3d 9, et 8 pour directinput, vu que la dinput 8 est la plus récente, du moins il n'y a pas eu de 9 que je sache. Mais que dois-je faire pour utiliser la bonne version et comment cela pourrait-il causer de tels problèmes?
m
0
l
a b L Programmation
1 Mars 2009 12:02:07

Je ne sais pas, je te propose une piste de recherche parce que je ne vois pas trop ce qui ne va pas. :) 
Pour trouver, il me faudrait faire des tests, mais je n'ai pas envie de trop réfléchir à ton problème. :) 

Bon, sinon quand tu dis:
Citation :
L'appel de la fonction Acquire() provoque des anomalie dans une librairie dll liée à mon exe.

C'est une dll que tu as faite?

m
0
l
6 Mars 2009 17:22:09

Oui c'est une dll que j'ai faite et j'ai essayer de dépister l'erreur je n'arrive pas plus loin que cette conclusion, Aquire provoque des anomalies. Incompréhensible!
m
0
l
a b L Programmation
6 Mars 2009 20:24:53

Et utilises-tu DirectX à la fois dans ta dll et dans ton exe ?
m
0
l
13 Mars 2009 08:56:20

Oui un seul contexte mais dans crée dans un exe et utilisé dans plusieurs dlls
m
0
l
24 Mars 2009 10:24:36

Eh bien je pense que je vais abandonné l'idée d'utiliser DirectInput, je vais revenir à l'API windows, parce que ce problème me dépasse complètement!

Quels auraient été les avantages exactement avec DI, pcq de ce que j'en ai utilisé, le clavier est en anglais, la souris est en position relative, tout ça est assez gênant finalement...
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS