Voila, je suis d�butant en C#, et apr�s avoir fait plusieurs tentatives je viens vous demander de l'aide.

J'ai une carte APPLICOM qui g�re un r�seau CAN. Avec cette carte, le fournisseur ma donner une DLL qui permet de dialoguer avec celle ci. Je l'ai tester avec LabWindows CVI et cela fonctionne. Quand j'essaye avec C# j'ai des codes d'erreur. A priori cela viendrait du tableau de byte passer par pointeur.

Voila le fichier H :
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
#ifndef __APPLICOMIO_HEADER_FILE__
 #define __APPLICOMIO_HEADER_FILE__
 
#include <cvidef.h>
typedef unsigned short WORD;
typedef unsigned char  BYTE;
typedef unsigned long  DWORD;
 
 
 
/* Translate a card number to a chan number */
 
#define CARD2CHAN(x) ((WORD)((x-1)*4))
 
/* Function prototype */ 
 
BOOL _stdcall AuInitBus_io   (DWORD* pdwStatus);
BOOL _stdcall AuExitBus_io   (DWORD* pdwStatus);
 
 
BOOL _stdcall AuWriteReadMsg_io (WORD    wChan,
                                 WORD    wNes,
                                   DWORD   dwMsgParam,
                                WORD    wNbTx,
                                BYTE*   lpbyBufTx,
                                WORD*   pwNbRx,
                                BYTE*   lpbyBufRx,
                                DWORD*  pdwStatus);
 
#endif
Dans ce fichier, j'utilie la fonction AuWriteReadMsg_io.

Voila le code en C# ( Microsoft express )
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
namespace CanCSharp
{
  unsafe public partial class Form1 : Form
  {
    int StatusInit=0;
    int StatusStop = 0;
 
    [DllImport("applicomio.dll")]
    public static extern bool AuInitBus_io(ref int StatusInit);
 
    [DllImport("applicomio.dll")]
    public static extern bool AuExitBus_io(ref int StatusStop);
 
    [DllImport("applicomio.dll")]
    public static extern bool AuWriteReadMsg_io(
     UInt16 wChan,
     uint wNes,
     uint dwMesParam,
     UInt16 wNbTx,
     ref byte []BufTx,
     ref UInt16 NbRx,
    ref byte []BufRx,
    ref uint Status);
 
   public Form1()
   {
     InitializeComponent();
   }
 
   private void InitBtn_Click(object sender, EventArgs e)
   {
     bool ready = AuInitBus_io(ref StatusInit);
 
     if (ready)
       ErrorInit.Text = "OK";
    else
      ErrorInit.Text = "Fault" + FunctionErrorMes(StatusInit);
 
   }
 
   private void Form1_Load(object sender, EventArgs e)
   {
      ErrorInit.Text = "";
      ErrorStop.Text = "";
   }
 
   private void StopBtn_Click(object sender, EventArgs e)
   {
     bool ready = AuExitBus_io(ref StatusStop);
 
     if (ready)
       ErrorStop.Text = "OK";
    else
      ErrorStop.Text = "Fault" + FunctionErrorMes(StatusStop);
 
   }
   private string FunctionErrorMes(int CodeErr)
   {
      if (CodeErr == 0)
       return "";
      if (CodeErr == 4)
       return " = Code ID déja utilisé ou erreur émission";
      if (CodeErr == 32)
       return " = Paramêtre non OK (trop long ou trop court)";
      if (CodeErr == 33)
       return " = Erreur Time Out";
      if (CodeErr == 36)
       return " = Equipement non configuré";
      if (CodeErr == 45)
       return " = Faire un init carte applicom";
      if (CodeErr == 47)
       return " = Carte Applicom non valide";
      if (CodeErr == 63)
       return "Erreur de communication";
      if (CodeErr == 66)
       return "Mémoire de la carte Applicom insuffisante";
      if (CodeErr == 93)
       return " = Driver inaccéssible";
      if (CodeErr == 99)
       return " = DLL applicomIO en cours d'utilisation";
      return " = Erreur inconnue";
   }
 
   public void SendBtn_Click(object sender, EventArgs e)
   {
      UInt16 wChan = 0;
      uint wNes = 1;
      uint dwMesParam = 0x180;
      UInt16 wNbTx = 5;
      byte [] BufTx;
      UInt16 NbRx = 0;
      byte [] BufRx;
      uint Status = 0;
 
      BufTx = new byte[5];
      BufTx[0] = 0x08;
      BufTx[1] =0x00;
      BufTx[2] =0x00;
      BufTx[3] =0x00;
      BufTx[4] =0x00;
      BufRx = new byte[1];
      BufRx[0] = 0x00;
 
      bool ready = AuWriteReadMsg_io
            (wChan,wNes,dwMesParam,wNbTx,ref BufTx,ref NbRx,
      ref BufRx,ref Status);
      if (ready)
        ErrorSend.Text = "OK";
      else
        ErrorSend.Text = "Fault" + FunctionErrorMes((int)Status);
 
   }
 
 }
}
Et voici l'exemple en C qui fonctionne :
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
void __declspec(dllexport) TX_TEST RunNCSCardsInNormalMode(tTestData
*testData, tTestError *testError)
{
    int error = 0;
    ErrMsg errMsg = {'\0'};
    ERRORINFO errorInfo;
 
    BOOL    Result = FALSE;
 
    BYTE     BufRx = 0;
    WORD     NbRx = 0;
    BYTE     BufTx[5] = {0x08,0x00,0x00,0x00,0x00};
    WORD     NbTx = 5;
    DWORD     MsgParam = 0x180;
    WORD     Nes = 1;
    WORD     Chan = 0;
 
    BufTx[3] = 0x00;
    AuWriteReadMsg_io (Chan, Nes, MsgParam, NbTx, BufTx,&NbRx, &BufRx, &error);
 
    Sleep(200);
 
    BufTx[3] = 0x02;
    AuWriteReadMsg_io (Chan, Nes, MsgParam, NbTx, BufTx,&NbRx, &BufRx, &error);
 
   Error: 
   // If an error occurred, set the error flag to cause a run-time error in
 TestStand.
   if (error != 0)
   {
     testError->errorFlag = TRUE;
 
     // OPTIONALLY SET THE ERROR CODE AND STRING
     testError->errorCode = error;
     testData->replaceStringFuncPtr(&testError->errorMessage, errMsg);
   }
 
   return; 
}
Lorsque je compile cette source cela ne g�n�re pas d'�rreur,mais ca marche pas Erreur 32 (Mauvais param�trage)
Lorsque je modifie le prototype de la fonction en mettant des pointeurs (comme en C), il n'arrive pas � li� le pointeur avec le tableau de byte. Donc si vous avez quelques pistes � exploiter, je suis prenneur