Dll c++ utilisée en C# [Résolu]

Signaler
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012
-
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012
-
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

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
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 );
Messages postés
29
Date d'inscription
vendredi 3 juin 2005
Statut
Membre
Dernière intervention
8 février 2012

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