Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

appel a une fonction d'une dll avec un param struct qui contient un tableau d'entiers

3 réponses
Avatar
Vérane Chanson
Bonjour,

Voici mon probleme:
J'ai une dll C++ dans laquelle j'ai la structure et la fonction suivante:

struct B {

int aLength;

int* aTab;

};



TEST_VCH2_API int fnladll3(B* aB); //renvoie la somme des elements du
tableau.



Je veux appeler cette fonction depuis C# et voici mon code :

[StructLayout(LayoutKind.Sequential)]

public struct B

{

public int aLength;

public int[] aTab;

}



[DllImport("ladll.dll")]

internal static extern int fnladll3(ref B aB);



private void button3_Click(object sender, System.EventArgs e)

{

B myB;

int[] myArray2 = new int[] {1, 3, 5, 7, 9};

myB.aTab = myArray2;

myB.aLength = myArray.Length;

int res3 = fnladll3(ref myB); //fait la somme des elements du tableau

MessageBox.Show(res3.ToString());

}



Le resultat res3 devrait valoir 25 mais il vaut une valeur tres grande qui
n'a rien a voir.

Il doit y avoir un probleme dans la maniere dont je passe ma struct, mais je
ne sais pas lequel.

(est-il possible de passer une struct qui a un champ tableau dedans ??)



Merci d'avance,

Verane.

3 réponses

Avatar
Yannick S.
ill ne faut pas faire B bb = new B() ?
et si du coté C# tu fais class plutot que struct ?
et si tu vires le ref dans ref myB lors de l'appel de la fonction ?

"Vérane Chanson" a écrit dans le message de
news: 418104b6$0$17370$
Bonjour,

Voici mon probleme:
J'ai une dll C++ dans laquelle j'ai la structure et la fonction suivante:

struct B {

int aLength;

int* aTab;

};



TEST_VCH2_API int fnladll3(B* aB); //renvoie la somme des elements du
tableau.



Je veux appeler cette fonction depuis C# et voici mon code :

[StructLayout(LayoutKind.Sequential)]

public struct B

{

public int aLength;

public int[] aTab;

}



[DllImport("ladll.dll")]

internal static extern int fnladll3(ref B aB);



private void button3_Click(object sender, System.EventArgs e)

{

B myB;

int[] myArray2 = new int[] {1, 3, 5, 7, 9};

myB.aTab = myArray2;

myB.aLength = myArray.Length;

int res3 = fnladll3(ref myB); //fait la somme des elements du tableau

MessageBox.Show(res3.ToString());

}



Le resultat res3 devrait valoir 25 mais il vaut une valeur tres grande qui
n'a rien a voir.

Il doit y avoir un probleme dans la maniere dont je passe ma struct, mais
je ne sais pas lequel.

(est-il possible de passer une struct qui a un champ tableau dedans ??)



Merci d'avance,

Verane.




Avatar
Vérane Chanson
Tu as pu t'en sortir avec tes strings dans la struct ? (je sais pas si tu as
vu ma reponse)


ill ne faut pas faire B bb = new B() ?


Ou ca ??

et si du coté C# tu fais class plutot que struct ?


il me fait une exception a l'execution car il n'a pas l'air d'aimer
marshaller une classe en struct...


et si tu vires le ref dans ref myB lors de l'appel de la fonction ?


Dans ce cas j'ai une erreur a la compil : Argument '1' : impossible de
convertir de 'TestVCH.Form1.B' en 'ref TestVCH.Form1.B'









"Vérane Chanson" a écrit dans le message de
news: 418104b6$0$17370$
Bonjour,

Voici mon probleme:
J'ai une dll C++ dans laquelle j'ai la structure et la fonction suivante:

struct B {

int aLength;

int* aTab;

};



TEST_VCH2_API int fnladll3(B* aB); //renvoie la somme des elements du
tableau.



Je veux appeler cette fonction depuis C# et voici mon code :

[StructLayout(LayoutKind.Sequential)]

public struct B

{

public int aLength;

public int[] aTab;

}



[DllImport("ladll.dll")]

internal static extern int fnladll3(ref B aB);



private void button3_Click(object sender, System.EventArgs e)

{

B myB;

int[] myArray2 = new int[] {1, 3, 5, 7, 9};

myB.aTab = myArray2;

myB.aLength = myArray.Length;

int res3 = fnladll3(ref myB); //fait la somme des elements du tableau

MessageBox.Show(res3.ToString());

}



Le resultat res3 devrait valoir 25 mais il vaut une valeur tres grande
qui n'a rien a voir.

Il doit y avoir un probleme dans la maniere dont je passe ma struct, mais
je ne sais pas lequel.

(est-il possible de passer une struct qui a un champ tableau dedans ??)



Merci d'avance,

Verane.








Avatar
Mitsuru FURUTA [Ms]
Bonjour,

L'écriture me semble bizarre.
Au premier abord, je pense que nous ne sommes pas sur de la taille mémoire
de Int[] aTab.
Dans le doute, il vaut mieux mettre IntPtr aTab dont on est sur qu'il
correspond à un pointeur classique tel que le définit int* aTab et jouer des
fonctions de Marshalling telles que:

System.Runtime.InteropServices.Marshal.StructureToPtr();
System.Runtime.InteropServices.Marshal.PtrToStructure();

Tiens moi au courant, ta question est intéressante,

Cordialement,

Mitsuru FURUTA [Microsoft FRANCE]

"Vérane Chanson" wrote in message
news:418104b6$0$17370$
Bonjour,

Voici mon probleme:
J'ai une dll C++ dans laquelle j'ai la structure et la fonction suivante:

struct B {

int aLength;

int* aTab;

};



TEST_VCH2_API int fnladll3(B* aB); //renvoie la somme des elements du
tableau.



Je veux appeler cette fonction depuis C# et voici mon code :

[StructLayout(LayoutKind.Sequential)]

public struct B

{

public int aLength;

public int[] aTab;

}



[DllImport("ladll.dll")]

internal static extern int fnladll3(ref B aB);



private void button3_Click(object sender, System.EventArgs e)

{

B myB;

int[] myArray2 = new int[] {1, 3, 5, 7, 9};

myB.aTab = myArray2;

myB.aLength = myArray.Length;

int res3 = fnladll3(ref myB); //fait la somme des elements du tableau

MessageBox.Show(res3.ToString());

}



Le resultat res3 devrait valoir 25 mais il vaut une valeur tres grande qui
n'a rien a voir.

Il doit y avoir un probleme dans la maniere dont je passe ma struct, mais


je
ne sais pas lequel.

(est-il possible de passer une struct qui a un champ tableau dedans ??)



Merci d'avance,

Verane.