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