Bonjour,
Je m’initie à C#. A titre d’exercice, je développe un programme qui commande un relais via USB. Pour cela je dispose d'une DLL écrite en C++ (disponible sur Git https://github.com/pavel-a/usb-relay-hid) et d'un Wrapper exemple pour utiliser les fonctions de la DLL en c#.

La première étape consiste à détecter la (les) cartes relais connectées compatibles à l’aide d’une fonction de la DLL . Cette fonction renvoie une structure qui contient le serial de la carte (pour y accéder avec une autre fonction de la DLL), le nombre de relais et un pointeur IntPtr sur la structure de la carte suivante (s’il y en une deuxième ou qui est null s’il n’y a pas d’autre - c'est ce que j'ai compris).
La déclaration de cette fonction dans c# :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
[DllImport("usb_relay_device.dll", EntryPoint = "usb_relay_device_enumerate",
CallingConvention = CallingConvention.Cdecl)]
//[return: MarshalAs(UnmanagedType.LPStruct)]
private static extern IntPtr Pusb_relay_device_enumerate();
public static usb_relay_device_info usb_relay_device_enumerate()
{
IntPtr x = RelayDeviceWrapper.Pusb_relay_device_enumerate();
usb_relay_device_info a = (usb_relay_device_info)Marshal.PtrToStructure(x, typeof(usb_relay_device_info));
return a;
}
La declaration de la structure dans C# :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
public struct usb_relay_device_info
{
[MarshalAs(UnmanagedType.LPStr)]
public string serial_number;
public IntPtr device_path { get; set; }
public usb_relay_device_type type { get; set; }
public IntPtr next { get; set; }
}
Pour récupérer la structure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
public usb_relay_device_info mydeviceinfo;
 
  private void ButtonFindDevice_Click(object sender, EventArgs e)
        {
            {
                mydeviceinfo = RelayDeviceWrapper.usb_relay_device_enumerate();
…
Je gère sans problème la première carte (excitation et désexcitation du relais)
Par contre lorsqu’il y a une deuxième carte sur un autre port USB je n’arrive pas à récupérer sa structure à partir de « mydeviceinfo.next » (qui est un IntpTr sur cette structure).

Nota : La DLL détecte bien si une deuxième carte est connectée
Je teste avec :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
                IntPtr myIntptr = mydeviceinfo.next;
                if (myIntptr == IntPtr.Zero)
                {
                    MessageBox.Show("Pas d'autre carte relais");
                }
                else
                {
                    MessageBox.Show("Attention d'autre(s) cartes relais sont connectées");
Pourriez-vous me dire comment accéder à la structure de la deuxième carte.