toni93330
Messages postés9Date d'inscriptiondimanche 19 novembre 2006StatutMembreDernière intervention14 février 2009
-
21 janv. 2009 à 10:38
toni93330
Messages postés9Date d'inscriptiondimanche 19 novembre 2006StatutMembreDernière intervention14 février 2009
-
23 janv. 2009 à 09:29
Bonjour,
Voila, je sais qu'il y a pas mal de post sur les dllimport en c#, mais je n'ai pas trouvé ce que je cherche (ou mal ?).
Alors voila j'ai une dll ecrit en C avec des fonctions qui prennent en second paramètre un char * (qui peut être modifié en sortie)
1) Mon problème est comment passé une structure en char * aux fonctions de la dll ?
2) dans certains cas j'ai besoin de passé un champs de la structure dans certaines fonctions, comment faire ?
Voici la déclaration de la structure en c#
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct SHISDOS
{
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.LONGSIZE)]
public string numdos; /* 1 : numero dossier */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.LONGSIZE)]
public string numlig; /* 2 : numero de ligne */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.LONGSIZE)]
public string date; /* 3 : date */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.CHARSIZE * 8)]
public string opera; /* 4 : code operation-document */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.CHARSIZE * 28)]
public string libell; /*C_( libell[2], 28) 5 : 1..2 libelles */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.CHARSIZE * 28)]
public string libell2; /*C_( libell[2], 28) 5 : 1..2 libelles */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)typesize.DOUBLESIZE * 6)]
public string[] montan; /* 20 : 1..6 ht tva exo (Etude)
ht tva exo (Debou) */
/* 21 : montant ttc */
/* 29 : 1..6 ht tva exo (Etude)
Ex. dispo ht tva exo (Debou) */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.INTSIZE)]
public string zondos; /* 7 : no zone dossier */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.CHARSIZE * 3)]
public string collab; /* 8 : code collaborateur */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.CHARSIZE)]
public string typhis; /* 9 : type d'historique */
/* O : Operation comptable */
/* C : Courrier */
/* A : Acte */
/* I : Calcul d'interet */
/* S : Message Serveur */
/* T : appel telephonique */
/* V : rendez-vous */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.CHARSIZE * 10)]
public string destin; /* 10 : destinataire /banque */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.CHARSIZE)]
public string gestio; /* 11 : Supp/Regu/Mult/Blanc */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.CHARSIZE)]
public string marque; /* 12 : marquage utilisateur */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.INTSIZE)]
public string tpspas; /* 13 : temps passe */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.INTSIZE)]
public string kilome; /* 14 : kilometres parcourus */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.CHARSIZE)]
public string determ; /* 15 : action determinante o/n */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.CHARSIZE * 3)]
public string ctitre; /* 16 : code titre */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.LONGSIZE)]
public string numfac; /* 17 : numero de facture */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.LONGSIZE)]
public string numgrp; /* 18 : numero de groupe */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.INTSIZE)]
public string numtva; /* 19 : indice tva */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.LONGSIZE)]
public string datcpt; /* 25 : date de comptabilisation*/
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.CHARSIZE)]
public string devise; /* 26 : monnaie: F=francs,E=euro*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)typesize.DOUBLESIZE * 3)]
public string[] valdev; /* 27 : valeur devise ht,tva,exo*/
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.LONGSIZE)]
public string numrec; /* 28 : numero de reçu */
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = (int)typesize.LONGSIZE)]
public string facture; /* 31 : numero de facture */
}
et la declaration fonction :
[DllImport("xxxdll.dll")]
static extern unsafe int readfic(int handle, [MarshalAs(UnmanagedType.ByValTStr )] string destination, int mode);
[DllImport("xxxdll.dll")]
unsafe static extern void stdbl(double value, [MarshalAs(UnmanagedType.ByValTStr )] string destination);
en C les declarations des fonctions :
extern "C" int readfic( int handle, char *buf, int mode);
extern "C" void stdbl(double, char *buf);
J'ai tout essayé mais pas réussi a faire marché .
Pouvez-vous m'aidé ?
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 22 janv. 2009 à 17:15
Oui c'est plus clair..
Dans ta struct c'est bien des tableaux inlines donc ta définition semble correct, il faut marshaller chaque champs par une string avec ByValTStr , SizeConst, le CharSet.Ansi de ta struct est correct aussi.. par contre le Pack= 1 il n'a pas lieu d'être là sauf si dans le code C/C++ il y a un #pragma pack de défini.
Si ça plante encore, essaye de remplacer les strings de la struct par des bytes ( 1 octet et sans zéro à la fin donc ). Les classes genre ASCIIEncoding etc.. permettent de concevertir des chaines en tableau de bytes.
[ DllImport( "xxx.dll" ) ]
// ou void* pour passer aussi l'adresse d'un élément.
// ou une surcharge qui prend un byte*.
private static extern unsafe void UnmanagedFunc( UnmanagedStruct* st );
la structure représente un enregistrement dans un fichier, ce fichier est de type c-isam donc toutes les fonctions de la dll prennent en char * en entrée En gros on a en C
isread(handle, (char *)&shisdos, 0);
Chaque champs de la structure n'est pas terminé par un 0, donc c'est reellement un tableau.
Voila, est-ce plus claire ?