Dll c++ utilisée en C#

Résolu
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012 - 8 févr. 2010 à 09:45
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012 - 9 févr. 2010 à 11:12
Bonjour à tous,

Je dois utiliser une Dll réalisée en C++ sur un programme en C#.

J'arrive à utiliser des fonctions simples telles que :
c++ : void P_afficher(void);
c# : [DllImport("ma.dll")]
static extern P_afficher();

Jusqu'ici tout va bien...
Mais la Dll que j'utilise contient des fonctions comportant des char ** et des int ** en paramètres :
c++ : int F_imprimerTexte(char ** p_P_C_texte ,
int p_I_long,
int** p_I_longExec)

c# : [DllImport("ma.dll")]
static externe int F_imprimerTexte(?,int p_I_long,?)

Comment dois-je faire pour retranscrire ce prototype à l'importation dans mon code C#?
J'ai essayer d'utiliser le type string, ma fonction s'exécute mais je ne retrouve pas ma chaine à la sortie.
Avez vous des pistes?
Merci beaucoup.

2 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
8 févr. 2010 à 20:46
Salut, c'est le genre de fonction bien compliquée à marshaller et assez lente. Je te donne un exemple de prototype mais il faudrait savoir si les paramètres sont en entrée et/ou en sortie et comprendre le fonctionnement de la fonction.

// Initialiser le tableau arr1.
// Allouer sur le tas non-managé le buffer arr2.
[ DllImport( ".." ) ]
public static extern int Func( [ In, Out ] String[ ] arr1, int size, ref IntPtr arr2 );
3
Florenzau Messages postés 29 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 8 février 2012
9 févr. 2010 à 11:12
Merci beaucoup,

J'ai codé mon import comme ceci:
[DllImport("ma.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int F_lireTexte( [In, Out]string[] p_P_P_C_texte,
ref IntPtr p_P_I_longueur);

Et le code qui l'utilise:
string[] l_P_P_C_buffer = new string[1];
IntPtr longueur = new IntPtr();
lireTexte(l_P_P_C_buffer , ref longueur);
MessageBox.Show(l_P_P_C_buffer [0]);

Et ça fonctionne parfaitement.

Encore merci Lutinore
0
Rejoignez-nous