C Dll call. IntPtr to string marshal

08/29/2015 19:02 YatoDev#1
Ich bekomme von meiner dll einen string zurück der so aussehen kann:

54738cru488vuwevu8null7943n50m8j934cm3u53n45u34nmu vnull

Die dll returned einen char*.

den char* kann ich dank compiler in meinem code als IntPtr marshallen.
[DllImport("Beispiel.dll")]
public static extern IntPtr beispiel(int beispiel);

Das funktioniert auch so weit.

um den string hinter dem pointer zu bekommen wollte ich jetzt Marshal.PtrToStringAnsi benutzen.
Da kommt es dann auch schon zu meinem problem.
Der return string der dll enthält immer 1 !!! null zeichen. Marshal.PtrToStringAnsi gibt aber alle zeichen bis zum ersten null zeichen zurück.

Also wie bekomme ich jetzt meinen string oder wie kann ich die größe des strings auf den gezeigt wird bekommen um dann die überladung von Marshal.PtrToStringAnsi(IntPtr, int) zu nutzen

PS: Ich werde kein unsafe verwenden
08/30/2015 12:18 warfley#2
Ein #00 darf nicht in einem String enthalten sein, da, sowohl c, als auch c# oder auch Java Strings mit Null terminieren. Für alles weitere solltest du einen Byte Array nehmen.

Den Konflikt hast du, da in c ein char* sowohl ein dynamisches Byte Array als auch ein String sein kann (C kennt keinen separaten datentyp für Byte) und du musst eben entsprechende Methoden verwenden, je nach dem ob es sich um einen String oder ein Array handelt
08/30/2015 14:09 YatoDev#3
welche methoden für ein array?
08/30/2015 21:00 warfley#4
Keine Ahnung, ich habe absolut keine Ahnung von Methoden in C# um einen IntPtr in Array oder anders rum zu converten. Mal ein ganz naiver Ansatz von mir bei dem ich mir denke dass es funktionieren könnte:
Code:
[DllImport("Beispiel.dll")]
public static extern Byte[] beispiel(int beispiel);
Denn zumindest im Unsafen code funktioniert das Casten von Pointern in Arrays problemlos
08/30/2015 23:05 YatoDev#5
Hatte es mit Marshal.Copy gelöst danke

Dein ansatz hätte auch funktioniert. byte ist genauso groß wie char in c aber .Net char ist doppelt so groß wie der c char!!!!
08/31/2015 00:44 Logtetsch#6
Quote:
Originally Posted by »FlutterShy™ View Post
Hatte es mit Marshal.Copy gelöst danke

Dein ansatz hätte auch funktioniert. byte ist genauso groß wie char in c aber .Net char ist doppelt so groß wie der c char!!!!
Liegt einfach daran, dass das .NET Unicode verwendet.
Vor einigen Tagen hatte ich das gleiche Problem. Für die, die es interessiert:
[Only registered and activated users can see links. Click Here To Register...]