Je fais un programme d'interface qui doit gérer à terme un programme central en c++. Pour ce faire je fais une interface graphique en c# et une dll C++ que j'importe.
Après lecture du tutorial sur l'interroperabilité j'ai utilisé la p/invoke ainsi:
code de la dll:
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 .h typedef struct DATAS { int * tabINT; int * tabBOOL; wchar_t **tabCHAR; }t_COMPUTDATA; .cpp t_COMPUTDATA *getStructureDataTest() { t_COMPUTDATA *data = new t_COMPUTDATA; data->tabINT= new int[size_set_datas]; data->tabBOOL= new int[size_set_commands]; data->tabCHAR= new char*[size_set_errors]; data->tabINT[0] = 12; data->tabINT[1] = 13; data->tabINT[2] = 222; data->tabBOOL[0]=0; data->tabBOOL[1]=1; data->tabBOOL[2]=0; data->tabCHAR[0]="Les sanglots longs de l'automne bercent mon coeur d'une langueur monotone"; return(data); }
dans le programme en c#
dans class FData:
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = (int)DATA.SIZE_SET_DATAS)] public Int32[] tabINT; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = (int)COMMAND.SIZE_SET_COMMANDS)] public Int32[] tabBOOL; [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)ERROR.SIZE_SET_ERRORS)] public IntPtr[] tabCHAR; public FData() { tabINT = new Int32[(int)DATA.SIZE_SET_DATAS]; tabBOOL = new Int32[(int)COMMAND.SIZE_SET_COMMANDS]; tabCHAR = new IntPtr[(int)ERROR.SIZE_SET_ERRORS]; } la fonction d'affichage: public void sreenFDatas() { Console.WriteLine("FData"); Console.WriteLine("FData.tabINT"); Console.WriteLine(tabINT[0]); Console.WriteLine(tabINT[1]); Console.WriteLine(tabINT[2]); Console.WriteLine("FData.tabBOOL"); Console.WriteLine(tabBOOL[0]); Console.WriteLine(tabBOOL[1]); Console.WriteLine(tabBOOL[2]); Console.WriteLine("FData.tabCHAR"); Console.WriteLine(tabCHAR[0]); } l'appel dans la winform fData = new FData(); IntPtr DataT = getStructureDataTest(); Marshal.PtrToStructure(DataT, fData);
Ce que j'obtient sur la console
FData.tabINT
59338008
59338032
59338052
FData.tabBOOL
196611
524697
13
FData.tabCHAR
222
Quelqu'un a une idée pour comprendre ce qui se passe? (conversion foireuse? écriture décalée de la mémoire? dois je remplacer les int32 par des int par exmple?). Merci d'avance!





Répondre avec citation








Partager