Speicherverletzung nach Char* Übergabe

BennyBookworm

Grünschnabel
Hallo allseits,
im Moment erstelle ich eine Oberfläche welche die Daten einer Messstation ausgibt.
Die Schnitstelle wird in Form einer C- DLL geliefert.

Einige Funktionen erwarten einen Char* als Übergabeparameter.
Bsp.:
long __stdcall psrGetNamenAllerMesswerte (char *pzNamen)
pzNamen ist Zeigt auf einen String in der die länge 10* Anzahlwerte haben muss und mit
den Namen der Werte gefüllt wird.

Es ist mir jedoch nicht möglich eine Funktion die einen *Char als Parameter erwartet aufzurufen da ich eine Speicherschutzverletzung bekomme.

Bsp.:
<DllImport("ProsumSrDLL.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi, throwonunmappablechar:=True)> _
Public Shared Function psrGetNamenAllerMesswerte (<[In](), Out(), MarshalAs(UnmanagedType.LPArray)> ByVal namen() As System.Char) As Int32
End Function
Ich habe hierbei schon iniges versucht... LBARRAY von Char() , IntPtr von Char()/String/Stringbuilder, LBStr (auch wenns eigentlich nicht passt) oder das Manuelle Freigeben von Speicher über Marshal.AllocCoTaskMem() und Marshal.AllocHGlobal() jedoch bekomme ich IMMER eine Speicherschutzverletzung.

Habt ihr vielleicht die Lösung, oder einen Tip in welcher Ecke das Problem zu finden ist?

Danke im Vorraus
Benny
 
Hast du denn beim Aufruf der Funktion auch Speicher vorher angefordert für 10*n?
Hast du selbst auch mal versucht ein char Array zu übergeben (mit In, Out Attribute)?

Bist du dir sicher das es am char Parameter liegt?
Vielleicht ist auch dein Rückgabetyp zu klein.
Meine mich zu erinnern das ich mal so ein Problem hatte und die gleiche Meldung bekahm.
 
Die gepostete Deklaration der Funktion verwendet einen Char Array als Übergabeparameter :confused:

Ich habe einfach mal mit AllocHGlobal() 50000Byte für mich beansprucht und der Funktion (die übrigens in meiner Testumgebung ein exakt 470 Byte langes Feld bräuchte) übergeben. --> Zugriffsverletzung.

Der "typ" des Zeigers ist der Funktion meines wissens egal, solange genug platz da ist, aber nen Byte-Array (um dem Vorschlag vorzugreifen:) ) schaft hier auch keine abhilfe :(



Der Rückgabe wert passt und entspricht genau dem C-Typ (Bei anderen Funktionen mit Primitieven Typen als in/out- Parametern funktioniert alles bestens.) und gibt nur einen Fehler/Erfolgskode zurück.
 
So, erledigt.
Nach viel rumprobieren hat sich herrausgestellt das der Fehler in der DLL lag.:rolleyes:

Naja, viel gelehrnt.

Danke nochmal an alle die sich den Threat angeschaut und mitgedacht haben.
 
Zurück