|
You last visited: Today at 12:27
Advertisement
C Dll call. IntPtr to string marshal
Discussion on C Dll call. IntPtr to string marshal within the .NET Languages forum part of the Coders Den category.
08/29/2015, 19:02
|
#1
|
elite*gold: 50
Join Date: Sep 2012
Posts: 3,841
Received Thanks: 1,462
|
C Dll call. IntPtr to string marshal
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
|
#2
|
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 573
|
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
|
#3
|
elite*gold: 50
Join Date: Sep 2012
Posts: 3,841
Received Thanks: 1,462
|
welche methoden für ein array?
|
|
|
08/30/2015, 21:00
|
#4
|
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 573
|
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
|
#5
|
elite*gold: 50
Join Date: Sep 2012
Posts: 3,841
Received Thanks: 1,462
|
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
|
#6
|
elite*gold: 192
Join Date: May 2009
Posts: 2,227
Received Thanks: 3,262
|
Quote:
Originally Posted by »FlutterShy™
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:
|
|
|
 |
Similar Threads
|
[SYSERR]LUA_ERROR: attempt to call a string value
12/01/2013 - Metin2 Private Server - 3 Replies
Hallo liebe Community,
ich habe hier ein Problem mit einer Quest.
Wenn ich eines der Items, die in der Quest als "Starter" (xxx.use) angegeben sind, benutze, erscheint in der SYSERR folgender Fehler:SYSERR: Dec 1 14:34:26 :: RunState: LUA_ERROR: attempt to call a string value
SYSERR: Dec 1 14:34:26 :: WriteRunningStateToSyserr: LUA_ERROR: quest skill_book_reading_test.start click
Wer kann helfen?
MfG
|
QUEST LUA_ERROR: ATTEMPT TO CALL A STRING VALUE
01/28/2013 - Metin2 Private Server - 10 Replies
Was bedeutet das?
was bedeutet das?
|
[Visual Basic] [Problem] String auslesen/String zufällig wählen
05/06/2012 - General Coding - 4 Replies
Code:
#include <GUIConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Name Generator", 236, 299, 815, 246)
$Input1 = GUICtrlCreateInput("Username", 24, 72, 185, 21)
$Input2 = GUICtrlCreateInput("Username", 24, 104, 185, 21)
$Input3 = GUICtrlCreateInput("Username", 24, 136, 185, 21)
$Input4 = GUICtrlCreateInput("Username", 24, 168, 185, 21)
$Input5 = GUICtrlCreateInput("Username", 24, 200, 185, 21)
|
All times are GMT +1. The time now is 12:29.
|
|