struct-Array an C++-DLL übergeben
-
Hallo,
ich grab diesen Thread nochmal aus. Vielleicht könnte Matze ja mal schreiben wie er es letztendlich umgesetzt hat.
Ich bin nämlich gerade an dem gleichen Problem. Bei einer Übergabe des Struktur-Arrays kann ich im C-Programm zwar lesen, aber nicht schreiben.Zum Testen habe ich mir jetzt folgendes geschrieben:
struct myStruct { int val; char data[20]; }; int printMyStructArray(struct myStruct myStr[], int anz){ int i; myStr[1].val = 987; //TEST schreiben for (i = 0; i < anz; i++) { printf("\nmyStruct[%d].val = %d\n", i, myStr[i].val); printf("myStruct[%d].data = %s\n", i, myStr[i].data); } return anz; }
Das Ganze in eine DLL gepackt und im C#-Programm folgende Importbeschreibung:
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)] private struct myStruct { public Int32 val; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 20)] public string data; } // int printMyStructArray(struct myStruct myStr[], int anz); [DllImport("mingw_dll.dll")] private static extern int printMyStructArray( myStruct[] myStr, int anz );
Und zum ausprobieren folgendes:
myStruct[] myStr = new myStruct[20]; myStr[0].val = 12; myStr[0].data = "Dies"; myStr[1].val = 34; myStr[1].data = "ist"; myStr[2].val = 56; myStr[2].data = "ein"; myStr[3].val = 78; myStr[3].data = "Test"; Console.WriteLine("Vorher:"); Console.WriteLine("myStr[1].val = " + myStr[1].val); ret = printMyStructArray(myStr, 4); Console.WriteLine("Nachher:"); Console.WriteLine("myStr[1].val = " + myStr[1].val); Console.WriteLine("returned: " + ret);
Ausgabe des Programmes:
Vorher: myStr[1].val = 34 myStruct[0].val = 12 myStruct[0].data = Dies myStruct[1].val = 987 myStruct[1].data = ist myStruct[2].val = 56 myStruct[2].data = ein myStruct[3].val = 78 myStruct[3].data = Test Nachher: myStr[1].val = 34 returned: 4
Das Lesen geht also, nur das Schreiben nicht.
Oben wurde ja mal geschrieben dass man das Problem lösen kann indem man die Struktur in eine extra Klasse packt. Gibt es dazu vielleicht ein Beispiel, oder eine andere Lösung?
Gruß
Thomas
-
Für mein konkretes Testbeispiel konnte ich das Problem mittels des Out-Attributes lösen:
[DllImport("mingw_dll.dll")] private static extern int printMyStructArray([In, Out] myStruct[] myStr, int anz);
Link zur MSDN:
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.outattribute.aspxGruß
-
Hi,
ich hatte genau das gleiche Problem, vielen Dank fuer die [In,Out] Loesung !!!
Funktioniert !