Bonjour,
Je rencontre une Exception AccesViolation lorsque j'appelle une méthode de la dll c via mon prog en c#.
La méthode appelée à pour argument une structure composée de plusieurs champs de type Byte[].
J'ai remarqué que si je passe, à la place de la structure qui cause l'exception, un Byte[] dont la taille est égale à celle de la somme des tailles des champs de ma structure, cela fonctionne mais il faut effectuer un traitement assez chiant pour remplir la stucture avec mon Byte[].
Voici comment elle déclarée la fonction en C
En c#
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CPS_InformationsPorteur ( UINT16 NumSession, struct CPS_InfosPorteur PTR pIP, struct CPS_StatusService PTR pStatusService, PUINT16 pEtatCarte);
La structure qui cause l'exception:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [DllImport("System\\cpsw32.dll", EntryPoint = "#8", CharSet = CharSet.Ansi)] public static extern UInt16 CPS_InformationsPorteur(UInt16 NumSession, ref CPS_InfosPorteur InfosPorteur, ref CPS_StatusService StatusService, ref UInt16 EtatCarte);
En C# j'ai traduit cette structure par:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 typedef struct CPS_InfosPorteur { UINT8 CodeCivilite [2]; UINT8 NomPatronym [27]; UINT8 NomMarital [27]; UINT8 Prenoms [3][27]; UINT8 PrenomUsuel [27]; UINT8 CodeLangues [4][2]; } CPS_InfosPorteur ;
Je pense qu'il s'agit d'un pb de déclaration au niveau de ma structure.
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 [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct CPS_InfosPorteur { public Byte[] CodeCivilite; public Byte[] NomPatronym; public Byte[] NomMarital; public Byte[] Prenoms1; public Byte[] Prenoms2; public Byte[] Prenoms3; public Byte[] PrenomUsuel; public Byte[] CodeLangues1; public Byte[] CodeLangues2; public Byte[] CodeLangues3; public Byte[] CodeLangues4; }
Je ne m'explique pas que si je passe une ref vers une structure ne contenant que des Byte[] j'obtiens une Exception alors que si je passe un Byte[] ca passe...
Je ne comprend pas non plus le fait que passer une ref vers un Byte[] puisse poser des pb. Après tout, cela correspond à un passage par référence ce que fait nativement C# pour la majorité des types !
Partager