Tuizi
Messages postés144Date d'inscriptionsamedi 21 octobre 2000StatutMembreDernière intervention 7 mai 2009
-
18 avril 2007 à 11:06
Tuizi
Messages postés144Date d'inscriptionsamedi 21 octobre 2000StatutMembreDernière intervention 7 mai 2009
-
19 avril 2007 à 13:18
Bonjour,
Voila en C++ j'ai une DLL que j'utilise sans problème, et j'aimerai l'utiliser sur un programme C#, tout marche bien, les dllImport fonctionnent à merveille, mais je suis tomber sur une structure où ça coince:
typedef struct
{
unsigned short wHandleMsg;
unsigned long dwIdent;
tCanTypeId eTypeId;
unsigned long dwMask;
tCanService eService;
unsigned long lPeriod;
unsigned long dwReserved1;
unsigned long dwReserved2;
unsigned short wDataLen;
unsigned char bData[CAN_MAX_DATA];
} tCanMsg;
Que j'ai donc transformer en C# par:
public
struct
CanMsg
{
public
UInt16 wHandleMsg;
p
ublic
UInt32 dwIdent;
public
CanTypeId eTypeId;
public
UInt32 dwMask;
public
CanService eService;
public
UInt32 lPeriod;
public
UInt32 dwReserved1;
public
UInt16 wDataLen;
public
byte[] bData;
};
Voyez vous une erreur? les CanTypeId et CanService sont de simple enum!
Car mon erreur vient du faite que le fonction qui utilise cette structure me dit qu'il y a une erreur de paramètre sur dwIdent
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201437 18 avril 2007 à 11:30
non... moi, je verrai bien :
[StructLayout(LayoutKind.Sequential)]
public struct CanMsg
{
public Int16 wHandleMsg;
public Int32 dwIdent;
public CanTypeId eTypeId;
public Int32 dwMask;
public CanService eService;
public Int32 lPeriod;
public Int32 dwReserved1;
public Int16 wDataLen;
public byte[] bData;
};
Tuizi
Messages postés144Date d'inscriptionsamedi 21 octobre 2000StatutMembreDernière intervention 7 mai 2009 18 avril 2007 à 12:14
Bidou> Non, je pense pas car ça va changer considérablement la taille de la variable, on va passer d'un 32 bits à du 64 bits
sebmafate> Non, ça n'a rien changé à mon problème
Je comprends pas pouquoi il ne veut pas de ma structure elle a la meme taille pourtant!
Tuizi
Vous n’avez pas trouvé la réponse que vous recherchez ?
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201437 18 avril 2007 à 13:13
arf... j'avais mal lu la struct c++
[StructLayout(LayoutKind.Sequential)]
public struct CanMsg
{
public UInt16 wHandleMsg;
public UInt32 dwIdent;
public CanTypeId eTypeId;
public UInt32 dwMask;
public CanService eService;
public UInt32 lPeriod;
public UInt32 dwReserved1;
public UInt16 wDataLen;
public byte[] bData;
};
Tuizi
Messages postés144Date d'inscriptionsamedi 21 octobre 2000StatutMembreDernière intervention 7 mai 2009 18 avril 2007 à 14:20
sebmafate> Oui donc on est bien d'accord sur la structure en C#
Mais ça ne résoud toujours pas le problème.
J'ai fais des test est lorsque CanTypeId vaut la valeur 1, la fonction me retourne l'erreur: Erreur de paramètre, eTypeID ne peut pas être 65535 et lorsque CanTypeID vaut 0, ça me dit que j'ai une erreur sur l'identifient dwIdent.
Casse tête chinois!
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 18 avril 2007 à 14:58
Salut, il est clair que les structures sont justement beaucoup moins limitées que les classes quand il s'agit d'interop. Là je vois 2 problèmes dans ta struct.. c'est pas un type blittable, bData est une référence vers un tableau qui pointe dans le tas, bData fait 32 bits ou 64 bits selon l'architecture du processeur et si tu utilises les pointeurs sur cette struct attention tu as un alignement sur dwIdent, ç-à-d que dwIdent se trouve à l'octet 4.
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 18 avril 2007 à 15:23
Un type de taille n est positionner à une adresse multiple de n. wHandleMsg est un ushort, 2 octets.. et donc tu t'attends à trouver dwIdent 2 octets plus loin alors qu'en réalité il est 4 octets plus loin. Normalement pas de problème entre C++ et C# sauf si le code C++ utilise le #pragma pack( ) ?? , si c'est le cas, corrige la struct C# avec le champ Pack de StructLayout. Corrige aussi le tableau.
Tuizi
Messages postés144Date d'inscriptionsamedi 21 octobre 2000StatutMembreDernière intervention 7 mai 2009 18 avril 2007 à 16:33
Ok merci pour le pack, ça a changer que mon application plante maintenant, mais c'est déja mieux!
Pour le tableau lors de l'utilisation je fais simplement un bData = new byte[8], ça ne va pas?