ybuchheit
Messages postés13Date d'inscriptionlundi 31 octobre 2005StatutMembreDernière intervention 1 février 2006
-
1 déc. 2005 à 16:51
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 2012
-
8 déc. 2005 à 04:42
Bonjour,
Je dois utiliser des fonctions d'une dll écrite en C. J'ai uniquement les prototypes des fonctions, je n'ai pas accès aux sources. Voici mes prototypes:
int funcA()
int funcB(char* param1, long param2)
la fonction B prend en paramètre un pointeur...J'ai donc créer un prog en cs utilisant les fonctions en les redéclarant dans une classe Wrap de cette manière:
[DllImport("C:\\madll.dll", CharSet=CharSet.Ansi)]
public static extern int funcA();
[DllImport("C:\\madll.dll", CharSet=CharSet.Ansi)]
public static extern int funcB(
[MarshalAs(UnmanagedType.LPStr)]
string param1, long param2);
J'appele mes fonctions de cette manière:
iRetour=Wrap.funcA();
string sChaineTraite="";
iRetour=Wrap.funcB( sChaineTraite + '\0', 10);
L'appel de la fonction A marche à chaque fois, par contre la fonction B ne marche que si je mets une chaîne vide, sans caractère. Je pense donc qu'il y a un problème pour transformer le string en char*. Quelqu'un aurait il une idée?
ybuchheit
Messages postés13Date d'inscriptionlundi 31 octobre 2005StatutMembreDernière intervention 1 février 2006 2 déc. 2005 à 09:50
Merci pour vos réponses.
Pour LPTStr çà ne marche pas non plus.
Pour le StringBuilder, je n'arrive pas à l'utiliser, le compilateur me met " Le type ou le nom d'espace de noms 'StringBuilder' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?)".
Mes using sont actuellement "System;" et "System.Runtime.InteropServices;"
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 8 déc. 2005 à 04:42
[ DllImport( "C:\\madll.dll", CharSet = CharSet.Ansi ) ]
public static extern int funcB( [ MarshalAs( UnmanagedType.LPStr ) ] string param1, long param2 );
Déja le long en C/C++ est un Int32 en C#.
iRetour=Wrap.funcB( sChaineTraite + '\0', 10);
On ne s'occupe pas du caractère nul '\0' en C# ( sauf cas particuliers.. ), réessaye avec le StringBuilder et le Int32 et sans ce caractère nul.
Au pire marque ton prototype unsafe ( compile en mode unsafe aussi ) et remplace ta chaine par un pointeur, de type byte* pour une chaine Ansi et char* pour une chaine Unicode. Tu peux fixer ( instruction fixed ) un tableau en mémoire pour passer son pointeur.