Florenzau
Messages postés29Date d'inscriptionvendredi 3 juin 2005StatutMembreDernière intervention 8 février 2012
-
8 févr. 2010 à 09:45
Florenzau
Messages postés29Date d'inscriptionvendredi 3 juin 2005StatutMembreDerniè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.
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 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 );
Florenzau
Messages postés29Date d'inscriptionvendredi 3 juin 2005StatutMembreDerniè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]);