Bonjour,
Ca fait déjà un certain temps que je galère la-dessus:
J'ai un problème sur un bout de code. J'ai une structure C++ et une structure C++/CLI correspondante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 //code non managé typedef struct { int intA; int intB; } MASTRUCT;et je veux appeler une fonction d'une DLL pour faire une opération avec un array rempli d'objets de cette structure, voici la fonction DLL:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 //code managé [StructLayout(LayoutKind::Sequential)] public ref struct MASTRUCTCLI public: int intA; int intB; };
pour passer un array en paramètre je sais que je dois bien le marshaliser en alouant un bout non managé de memoire et passer l'adresse en IntPtr ce que j'ai bien fait etc.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 //Code non managé extern "C" __declspec(dllexport) void Cpp(MASTRUCT *t[], int longueur) { int i ; for(i=0; i < longueur - 1 ; i++) { t[i]->intA += 10; t[i]->intB += 10; }
Le code compile mais il me donne une exception SystemReferenceNULL, comme quoi il n'y a rien ds l'addresse que j'ai passée en paramètre à ma fonction DLL. Et en plus, pour essayer de comprendre cette exception, après la boucle de marshalisation j'ai mis une autre de" demarshalisation " qui remettait le contenu des addresses en structure (Marshal:: PtrToStructure(temp, StructureTemp)) et cette boucle me renvoie toutes les données parfaitement placées et tout.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 //code managé [DllImport("marshallingDLL.dll")] extern "C" void Cpp( IntPtr p , int longueur); ... main(){ array<MASTRUCTCLI^> ^myArray = gcnew array<MASTRUCTCLI^>(10); //remplissage du tableau.. int sizeBase = Marshal::SizeOf(myArray[0]) for (int i =0;i< 2;i++) { temp = IntPtr(p.ToInt32()+ i*sizeBase); Marshal::StructureToPtr(myArray[i],temp,false); } Cpp(p, longueur);
Donc je ne comprends pas d'ou cette exception vient. Si quelqu'un pouvait m'aider j'en serais très reconnaissant.
Merci d'avance
Partager