Tom's Guide > Forum > Programmation > Problème DirectInput!

Problème DirectInput!

Forum Programmation : Problème DirectInput!

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

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:

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



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

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

Et en forground au lieu de background, c'est pareil ?
Et en enlevant la souris ?


Message édité par CRicky le 09-02-2009 à 21:56:47
------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

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?

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

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!

Répondre à molotov2

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.


Message édité par CRicky le 20-02-2009 à 20:38:30
------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

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?

Répondre à molotov2

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?

 


Message édité par CRicky le 01-03-2009 à 12:03:10
------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

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!

Répondre à molotov2

Et utilises-tu DirectX à la fois dans ta dll et dans ton exe ?

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Oui un seul contexte mais dans crée dans un exe et utilisé dans plusieurs dlls

Répondre à molotov2

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...

Répondre à molotov2
Tom's Guide > Forum > Programmation > Problème DirectInput!
Aller à :

Il y a 1567 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens