Appel de fonction contenu dans une DLL (exception PInvoke)

Signaler
Messages postés
2
Date d'inscription
mardi 3 février 2015
Statut
Membre
Dernière intervention
9 février 2015
-
Messages postés
2
Date d'inscription
mardi 3 février 2015
Statut
Membre
Dernière intervention
9 février 2015
-
Bonjour,

Je travaille sur un projet domotique mélangeant électronique et informatique. Je suis actuellement sur l'établissement d'une communication USB entre un PIC18F4550 de Microchip et un applicatif PC développé en VB.NET FrameWork 4.

Je suis bloqué depuis plusieurs jours sur la génération d'une exception lors de l'exécution de mon code .NET et malgré de nombreuses recherches et autant d'essais, je n'arrive toujours pas solutionner cette exception que voici.

J'utilise la DLL fournit par Microchip pour utiliser l'USB : mpusbapi.dll
Celle-ci est codée en C++ dont voici l'extrait qui pose problème :

DWORD MPUSBGetDeviceCount(PCHAR pVID_PID)
{
    DWORD count;        // Number of USB device with matching VID & PID
    count = 0;          // Initialization

    for(int i = 0; i < MAX_NUM_MPUSB_DEV; i++)
    {
        if(MPUSBGetDeviceLink(i,pVID_PID,NULL,NULL,NULL) == MPUSB_SUCCESS)
            count++;
    }//end for
    return count;
}//end MPUSBGetDeviceCount


Voici la déclaration correspondante dans mon projet VB.NET :
Imports System.Runtime.InteropServices
Module VBMPUSBAPI

    'DWORD _MPUSBGetDLLVersion(void)
    'DWORD _MPUSBGetDeviceCount(PCHAR pVID_PID)

    Public Declare Function MPUSBGetDLLVersion Lib "mpusbapi.dll" Alias "_MPUSBGetDLLVersion" () As Integer
    Public Declare Auto Function MPUSBGetDeviceCount Lib "mpusbapi.dll" Alias "_MPUSBGetDeviceCount" (<MarshalAs(UnmanagedType.LPTStr)> ByRef pVID_PID As String) As Integer

(des essais avec LPStr, LPWStr et byval sont également infructueux, mais peut-être mal associé ?)

Les appels de fonctions dans l'application VB.NET :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim jd As Integer
        jd = VBMPUSBAPI.MPUSBGetDeviceCount("vid_04D8&pid_000A")
        MsgBox(MPUSBGetDLLVersion())
End Sub


L'exception se produit à l'appel de fonction MPUSBGetDeviceCount dont voici le message :
Un appel à la fonction PInvoke 'Project1!Project1.VBMPUSBAPI::MPUSBGetDeviceCount' 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.

Pour info, l'appel MPUSBGetDLLVersion fonctionne correctement.


Les pistes explorées me mènent sur un problème de compatibilité entre le type PCHAR du paramètre de la fonction (pointeur sur une chaîne de caractère) et son homologue String de VB.NET mais après avoir essayé beaucoup de chose, je n'y arrive pas.

Voyez-vous quelque chose qui ne va pas ? Avez vous besoin d'autres informations / détails / code supplémentaire ?

Merci beaucoup pour votre aide.

1 réponse

Messages postés
2
Date d'inscription
mardi 3 février 2015
Statut
Membre
Dernière intervention
9 février 2015

Bonjour.

Pas d'idée sur la cause du problème ?

Merci
JDD