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.aspx

    Gruß



  • Hi,

    ich hatte genau das gleiche Problem, vielen Dank fuer die [In,Out] Loesung !!!
    Funktioniert !


Anmelden zum Antworten