Appel d'une dll avec tableau & structure

Résolu
Morgan_2956 Messages postés 16 Date d'inscription lundi 11 décembre 2006 Statut Membre Dernière intervention 4 février 2010 - 4 févr. 2010 à 14:11
Morgan_2956 Messages postés 16 Date d'inscription lundi 11 décembre 2006 Statut Membre Dernière intervention 4 février 2010 - 4 févr. 2010 à 19:18
Bonjour à tous,
Malgré toutes mes recherches et essais, je n'arrive décidément pas à passer des tableaux dans une structure provenant d'une dll.
Je dois utiliser une dll contenant une fonction qui renvoie une structure qui contient des tableau de int, byte,...
Pour débuter dans le code non managé, j'ai créé une dll de test avec un premier exemple qui de structure simple sans tableau. Dans ce cas pas de problème cela fonctionne bien.
La ou ca coince, c'est avec des tableaux!!!


Voici comment elle déclarée la fonction en C:
typedef struct DLLStrucure
{
uint8 Valeur1[4];
} DLLStrucure ;


fonction C utilisée:
DLLStrucure DLL_EXPORT FunctionStruct()


Dans mon programme c#:
[StructLayout(LayoutKind.Sequential)]
public class MyStruct
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = UnmanagedType.U1)]
public byte[] Valeur1;

public MyStruct()
{
this.Valeur1 = new byte[4];
}
}


voici comment je déclare et appel la fonction de la dll:
MyStruct TestStruct2 = new MyStruct();
TestStruct2 = FunctionStruct();
et la j'ai l'erreur "Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée."
Si quelqu'un peut m'aider, je le remercie par avance.

7 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
4 févr. 2010 à 16:33
En code unsafe ça passe peut être

[ StructLayout( LayoutKind.Sequential ) ]
struct MyStruct // Compiler avec -unsafe
{
    public fixed byte arr[ 4 ];

    // ..
}
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
4 févr. 2010 à 18:57
Un copié collé d'un ancien message :

// v1.cpp

void DoSomething( MyStruct* p )
{
if ( p != NULL )
{
p->x = 0;
p->y = 1;
}
}

// v1.cs

[ DllImport( ".." )]
static extern void DoSomething( ref MyStruct myStruct );

MyStruct myStruct = new MyStruct( );
DoSomething( ref myStruct );

Ou alors

// v2.cpp

MyStruct* DoSomething( )
{
MyStruct* p = new MyStruct( );
p->x = 0;
p->y = 1;

return p;
}

void Free( MyStruct* p )
{
if ( p != NULL )
delete p;
}

// v2.cs

[ DllImport( ".." ) ]
static extern IntPtr DoSomething( );

[ DllImport( ".." ) ]
static extern void Free( IntPtr ptr );

IntPtr ptr = DoSomething( );
MyStrcut myStruct = ( MyStruct )Marshal.PtrToStructure( ... ); // Ou du code unsafe

// ..

Free( ptr );
On peut aussi utiliser CoTaskMemAlloc et FreeCoTaskMem ce qui évite de définir une fonction Free.
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
4 févr. 2010 à 15:26
Salut, la défintion est correcte c'est d'utiliser une structure qui contient un tableau comme type de retour qui pose problème, je ne pense pas qu'initialiser le tableau avant l'appel change quelque chose (à voir). La structure est minimaliste, remplace le tableau par 4 bytes.
0
Morgan_2956 Messages postés 16 Date d'inscription lundi 11 décembre 2006 Statut Membre Dernière intervention 4 février 2010
4 févr. 2010 à 15:37
Merci de ta réponse, mais en fait je travail par étape, puisqu'au final je doit récupérer une structure bien plus grosse avec des tableaux de float, uint8, uint16, int8, ...
Donc pour le moment j'essaye avec une structure de test contenant un tableau simple.

Mais je comprend pas pourquoi utiliser une structure qui contient un tableau comme type de retour qui pose problème! puisse que la taille du tableau est connu!

Ca doit quand même être possible !!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
4 févr. 2010 à 16:28
Renvoyer par valeur une structure qui contient des tableaux inline c pas bien et c'est lent, il serait plus correct de demander à l'utilisateur d'allouer sa structure et de la passer en paramètre.
0
Morgan_2956 Messages postés 16 Date d'inscription lundi 11 décembre 2006 Statut Membre Dernière intervention 4 février 2010
4 févr. 2010 à 18:09
en code unsafe ca passe!! merci!
En revanche je viens lire cette structure dans la dll à 25Hz, donc si cette methode est longue, il serait préférable de changer de solution. Pour cela il faut que mon fournisseur de la dll veuille bien faire la modif!
omment on peut allouer la structure et la passer en paramètre? Aurais tu un exemple?
0
Morgan_2956 Messages postés 16 Date d'inscription lundi 11 décembre 2006 Statut Membre Dernière intervention 4 février 2010
4 févr. 2010 à 19:18
Ha oui en fait par un pointeur!!
je vais faire cela.
Merci beaucoup!
0
Rejoignez-nous