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
Tuizi
Messages postés144Date d'inscriptionsamedi 21 octobre 2000StatutMembreDernière intervention 7 mai 2009 18 avril 2007 à 21:58
40 octets avec le MarshalAs
36 octets sans.
Mais du coup maintenant vu que tout marche bien, limite je n'ai plus a m'en soucier. J'ai juste a créé un tableau de la taille des données. L'interet de cette déclaration en C++ c'est qu'il ne faut pas que la taille de ce tableau dépasse 8 et ça en C# je vois pas comment faire, sauf bien sur avec un if
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 19 avril 2007 à 02:30
Oui c'est limité à 8 bytes mais ça c'est la contrainte imposé par la définition en C++. Si c'est un paramètre en retour c'est inutile de l'allouer par contre si c'est un paramètre que tu dois remplir avant de le passer au code C++, effectivement dans ce cas faudra l'allouer avec new.. Je me souviens pas avoir testé mais logiquement le runtime devrait marshaller uniquement les 8 premiers bytes sans générer d'erreur même si le tableau est plus grand.
L'autre possibilité c'est le tableau de taille fixe.. mais là attention aucun test de dépassement de capacité n'est effectuer.
public unsafe struct CanMsg
{
// ..
public fixed byte bData[ CAN_MAX_DATA ];
}
Tuizi
Messages postés144Date d'inscriptionsamedi 21 octobre 2000StatutMembreDernière intervention 7 mai 2009 19 avril 2007 à 13:18
Oui c'est une structure que je complete pour la passer au code C++, donc c'est vraiment important de controlé la taille.
Non mais sinon pas grave je vais simplement faire une vérif sur la taille des données à traiter!