Recuperer un tableau de pointeur en parametre d'une DLL
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 2010
-
1 avril 2008 à 18:50
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 2010
-
3 avril 2008 à 08:08
J'essaye de recuperer un tableau de pointeur alloué dans une DLL
Ce que j'ai essayé marche mais seulement pour le premier element du tableau
J'alloue un IntPtr []
Je le passe a la DLL
Et la DLL le modifie (c'est evidement ici qu'il y a unn couac conceptuel)
Je converti le premier pointeur ren String : OK
Mais pour les autres ca marche pas
Voici la synthese minimale du code
Dans le cas present, bctaGetName rends un count de 2 et a alloué un tableau de deux pointeurs
mais a mon avis je me plante dans le passage de StrPrt car au retour cet array a une Lenght de 1, le premier string est ok mais je ne sais pas acceder le deuxieme (deuxieme pointeur)
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 3 avril 2008 à 08:08
Bonjour,
J'ai ramé un bon coup mais j'ai fini par travailler directement avec des pointeurs et ca marche bien
(il faut savoir que c'est la dll qui alloue et gere ses bufffer)
[DllImport("bcta.Dll")]
static public unsafe extern int bctaGetName(IntPtr hBcta, UInt32 nAttID, out IntPtr** StrPtr);
unsafe static public int RoadNameById()
{
char ch = (char)1;
IntPtr hBcta = (IntPtr)0;
UInt32 attrId = 1039;
int count;
IntPtr** StrPtr;
Routing.bctaOpen(ref hBcta, Environ.RoutingDataPath, ch);
attrId = 8967209;
count = bctaGetName(hBcta, attrId,out StrPtr);
for (int i = 0; i < count; i++)
{
string aa = Marshal.PtrToStringAnsi((IntPtr)StrPtr[i]);
}
Routing.bctaClose(hBcta);
return 0;
}