Manette de jeu et visual basic 2005

Résolu
sidne_II
Messages postés
4
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
17 juin 2007
- 17 juin 2007 à 18:53
cs_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
- 18 juin 2007 à 09:37
Bonsoir

Je n'arrive pas à utiliser l'API pour lire le joystick avec la foncion    joyGetPos (0, manette_info)

  Public Structure JOYINFO
        Public wXpos As Long
        Public wYpos As Long
        Public wZpos As Long
        Public wButtons As Long

    End Structure

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'rem
        Dim Erreur_retour As Long
        Dim manette_info As JOYINFO
        Erreur_retour = joyGetPos(0, manette_info)
    End Sub

Voila le message d'erreur à l'execution
Un appel à la fonction PInvoke 'Joypad Le test!WindowsApplication1.Module1::joyGetPos' a déséquilibré la pile. Cela peut se produire, car la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.

Si quelqu'un peut m'aider

Merci d'avance

Amigalement

10 réponses

cs_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
17 juin 2007 à 22:44
Essaye peut-etre avec ceci :

   Declare Function joyGetPos Lib "winmm.dll" (ByVal uJoyID As Integer, ByRef pji As JOYINFO) As Integer

il n'y a plus l'erreur, mais je sais pas si les infos passent quand même, j'ia pas de joystick pour vérifier

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
3
cs_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
17 juin 2007 à 19:01
Je sens qu'il va flloir mettre un système de réponses automatiques pour ce genre de question.

Une petite recherche sur le forum, t'aurais appris que l'on doit y répondre en gors 2 à 3 fois par semaines.

Il y a un problème de type de variable entre .Net et les api win32.

Tous ce qui est de type Long dans les api, il faut le déclarer comme Interger dans .Net

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
0
sidne_II
Messages postés
4
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
17 juin 2007

17 juin 2007 à 19:13
Merci pour cette réponse dépassant  la vitesse de celle de la réponse automatique

J'ai effectué une recherche un peu partout mais toutes les solutions que j'ai trouvées ne s'applique qu' à VB  6

Mais je suis certainement un peu obtu ,car même en remplaçant long par integer  il me renvoie toujours le même message  que je ne comprends pas

Si quelqu'un peut m'aider je lui en serai reconnaissant

Amigalement 
0
cs_akim77
Messages postés
73
Date d'inscription
lundi 12 avril 2004
Statut
Membre
Dernière intervention
17 septembre 2008
4
17 juin 2007 à 21:39
Salut,

Après les modifications préconisées par Casy, ton code  doit resembler à çà:

Declare Function joyGetPos Lib "winmm.dll" ( _
ByVal uJoyID As Integer, ByRef pji As JOYINFO) As Integer

Type JOYINFO
    wXpos As Integer
    wYpos As Integer
    wZpos As Integer
    wButtons As Integer
End Type

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    'rem
        Dim Erreur_retour As Integer
        Dim manette_info As JOYINFO
        Erreur_retour = joyGetPos(0, manette_info)
End Sub

Sinon montre nous ton code complet.

@+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sidne_II
Messages postés
4
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
17 juin 2007

17 juin 2007 à 21:50
Merci pour votre aide voici le code  aprés la modif

Public Class Form1

    Public Structure JOYINFO
        Public wXpos As Integer
        Public wYpos As Integer
        Public wZpos As Integer
        Public wButtons As Integer

    End Structure
    Dim manette_info As JOYINFO

    Declare Function joyGetPos Lib "winmm.dll" (ByVal uJoyID As Integer, ByVal pji As JOYINFO) As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'rem
        Dim Erreur_retour As Integer
        Erreur_retour = joyGetPos(0, manette_info)
    End Sub
End Class

en rouge le message d'erreur à l'exécution
Un appel à la fonction PInvoke 'Joypad Le test!WindowsApplication1.Form1::joyGetPos' a déséquilibré la pile. Cela peut se produire, car la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.

Je ne comprends pas la signification de ce message d'erreur
Si quelqu'un peut m'aider je lui en serais reconnaissant

Merci encore pour vos réponses

Amigalement
0
cs_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
17 juin 2007 à 22:19
Le problème viens certainement du passage de la structure à l'api.
Les structures .Net ne doivent pas etre stockées comme en vb6 probablement d'ou le désiquilibre de la pile lors de l'appel.

Pour l'instant je n'ai pas encore trouvé la solution. Peut-etre faut-il passer par un marshaling ?

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
0
sidne_II
Messages postés
4
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
17 juin 2007

17 juin 2007 à 23:00
Je viens de tester  a priori cela fonctionne , j'ai branché une manette et les boutons sont bien détecté . A priori c'est bien dans le passage de la structure à l'API

Un grand merci

Je vais  essayer de finaliser le code  pour le mettre à disposition , mais j'ai encore du boulot

Amigalement
0
cs_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
17 juin 2007 à 23:10
Ok, c'est tout simplement une erreur de déclaration

Je confirme en regardant la déclaration pour VB6, que c'est bien ByRef qu'il faut mettre.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
0
Julien237
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
18 juin 2007 à 09:23
Cool j'avais jamais vu qu'on pouvait utiliser un joystick sans passer par DirectInput, c'est nettement plus simple à mettre en place comme ça, merci d'avoir posé ta question ...
Pense à accepter une réponse de Casy pour valider le topic...

Julien.
0
cs_casy
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
18 juin 2007 à 09:37
La gestion du joystick est compris de base dans tous les PC. Elle fait aprtie de la toute première norme des PC aux coté des 4 ports séries, des 3 ports parallèles, de la carte vidéo VGA, etc..... Elle existait déjà sous  le tout premier Dos, il est logique que Windows l'implante.

Cependant l'API Windows ne doit etre probablemnt qu'une surcharge de ce qui existe au niveau bios. Il n'est, je pense, pas question de gerer des joysticks hyper évolués ou autres volants, ... juste le truc de base.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
0