Bonjour,

Voila mon probleme :

J'utilise une dll écrite en c++ dans mon application c#. Cette dll utilise un callback. Voila le prototype de la fonction callback en c++ :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
// Definition de la callback pour les messages spontanées
typedef void f_App_ProcessSpontaneous(char *message);
Voila la déclaration de mon delegate en c# :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
public delegate void CallbackFunc(String message);
Voila le code de ma methode :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
public static void TheCallBackFunct(String message)
  {
            if (message == null)
            {
                Console.WriteLine("\nCallback called with param null");
            }
            else
            {
                Console.WriteLine("\nCallback called with param {0}",message);
            }
 }
Voila l'ensemble de mon petit programme de test :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
        public delegate void CallbackFunc(String message);
 
        [DllImport("..\\..\\XXX.dll", CharSet = CharSet.Ansi)]
        static extern bool Connect(
            Byte Protocol,
            char ip,
            ushort Port,
            uint BaudRate,
            ushort ID,
            bool Mode,
            CallbackFunc funct
        );
 
        [DllImport("..\\..\\XXX.dll", CharSet = CharSet.Ansi)]
        static extern Byte SendWait(
            ushort ID,
            string mess,
            StringBuilder Retbuf
        );
 
static void Main()
        {
            bool resu = false;
            Console.WriteLine("Resu avant : " + resu.ToString());
            char caractNull = '\0';
 
            // Creation de la fonction call back
            CallbackFunc callback = new CallbackFunc(TestsDLL.maClasse.TheCallBackFunct);
            resu = Connect(1, caractNull, 1, 19200, 0x00FF, false, callback);
 
            Console.WriteLine("Resu apres : " + resu.ToString());
            if (resu)
            {
                Byte ret = 0x01;
                Console.WriteLine("Envoi de : DC");
 
                StringBuilder messRecv = new StringBuilder(4096);
 
                ret = SendWait(0x00FF, "DC", messRecv);
                Console.WriteLine("Retour : " + messRecv.ToString());
                Console.WriteLine("Erreur : " + ret);
            }
            Console.WriteLine("Fin...");
            Console.ReadLine();
        }
 
public static void TheCallBackFunct(String message)
        {
            if (message == null)
            {
                Console.WriteLine("\nCallback called with param null");
            }
            else
            {
                Console.WriteLine("\nCallback called with param {0}",message);
            }
        }
Lorsque j'execute ce petit programme de test tout fonctionne correctement sauf lorsqu'il passe dans la methode "TheCallBackFunct", voila l'erreur qui apparaît :

"The value of ESP was not properly saved across a function call. Thi is usually a result of calling a function declared whith one calling convention with a function declared with a different caling convention."

Qu'est-ce que je dois faire ???


Merci d'avance pour votre aide.