Importer une DLL C dans un prog C#

Signaler
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006
-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
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

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Salut, n'oublie pas que les instances du type String sont immuables, utilises StringBuilder si la fonction doit modifier la chaine.
Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
7
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...
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006

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;"
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Ajoute la dierctive
using System.Text;

Mx
Messages postés
13
Date d'inscription
lundi 31 octobre 2005
Statut
Membre
Dernière intervention
1 février 2006

Merci, j'ai essayé avec un StringBuilder mais çà ne marche toujours pas
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
[ 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.