Appel d'une dll avec tableau & structure [Résolu]

Morgan_2956 16 Messages postés lundi 11 décembre 2006Date d'inscription 4 février 2010 Dernière intervention - 4 févr. 2010 à 14:11 - Dernière réponse : Morgan_2956 16 Messages postés lundi 11 décembre 2006Date d'inscription 4 février 2010 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 4 févr. 2010 à 16:33
3
Merci
En code unsafe ça passe peut être

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

    // ..
}

Merci Lutinore 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de Lutinore
Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 4 févr. 2010 à 18:57
3
Merci
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.

Merci Lutinore 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de Lutinore
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 4 févr. 2010 à 15:26
0
Merci
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.
Commenter la réponse de Lutinore
Morgan_2956 16 Messages postés lundi 11 décembre 2006Date d'inscription 4 février 2010 Dernière intervention - 4 févr. 2010 à 15:37
0
Merci
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 !!
Commenter la réponse de Morgan_2956
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 4 févr. 2010 à 16:28
0
Merci
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.
Commenter la réponse de Lutinore
Morgan_2956 16 Messages postés lundi 11 décembre 2006Date d'inscription 4 février 2010 Dernière intervention - 4 févr. 2010 à 18:09
0
Merci
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?
Commenter la réponse de Morgan_2956
Morgan_2956 16 Messages postés lundi 11 décembre 2006Date d'inscription 4 février 2010 Dernière intervention - 4 févr. 2010 à 19:18
0
Merci
Ha oui en fait par un pointeur!!
je vais faire cela.
Merci beaucoup!
Commenter la réponse de Morgan_2956

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.