Recuperer un tableau de pointeur en parametre d'une DLL

olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 - 1 avril 2008 à 18:50
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 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)

 [DllImport("bcta.Dll")]
    staticpublicexternint bctaGetName(IntPtr hBcta, UInt32 nAttID, ref IntPtr [] StrPtr);
 
 
    staticpublicint TestName()
    {
      IntPtr hBcta = (IntPtr)0;
      UInt32 attrId = 0;
      int count;
      IntPtr[] StrPtr = new IntPtr[8];
 
      Routing.bctaOpen(ref hBcta);
      attrId = 8967209;
      count = bctaGetName(hBcta, attrId, ref StrPtr);
 
      string val = Marshal.PtrToStringAnsi(StrPtr[0]);
 
      Routing.bctaClose(hBcta);
      return0;
    }

Je devrais pouvoir fair un truc du genre

for(int i=0;i<count;i++)
{
      string val = Marshal.PtrToStringAnsi(StrPtr[i]);
}

1 réponse

olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
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;
    }
0
Rejoignez-nous