Manette de jeu et visual basic 2005 [Résolu]

Signaler
Messages postés
4
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
17 juin 2007
-
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
-
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

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
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 #   
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
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 #   
Messages postés
4
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
17 juin 2007

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 
Messages postés
73
Date d'inscription
lundi 12 avril 2004
Statut
Membre
Dernière intervention
17 septembre 2008
4
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.

@+
Messages postés
4
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
17 juin 2007

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
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
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 #   
Messages postés
4
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
17 juin 2007

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
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
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 #   
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
6
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.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
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 #