Importer une DLL C dans un prog C#

ybuchheit Messages postés 13 Date d'inscription lundi 31 octobre 2005 Statut Membre Dernière intervention 1 février 2006 - 1 déc. 2005 à 16:51
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 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?

6 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
1 déc. 2005 à 17:46
Salut, n'oublie pas que les instances du type String sont immuables, utilises StringBuilder si la fonction doit modifier la chaine.
0
LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 8
2 déc. 2005 à 05:38
Salut ybuchheit,

Essayes voir d'importer ta méthode de cette façon :

DllImport( "C:\\madll.dll" )]
public static extern int funcB(
[MarshalAs( UnmanagedType.LPTStr )]
string param1, long param2 );

Si tu est sous Windows NT ou Windows XP, il faut encoder les chaîne en Unicode !
Avec cet attribut, c'est géré automatiquement...
0
ybuchheit Messages postés 13 Date d'inscription lundi 31 octobre 2005 Statut Membre Derniè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;"
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
2 déc. 2005 à 09:52
Ajoute la dierctive
using System.Text;

Mx
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ybuchheit Messages postés 13 Date d'inscription lundi 31 octobre 2005 Statut Membre Dernière intervention 1 février 2006
5 déc. 2005 à 08:40
Merci, j'ai essayé avec un StringBuilder mais çà ne marche toujours pas
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
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.
0
Rejoignez-nous