char* an Methode übergeben - wie wrappen???

16/09/2007 - 14:01 von Bastie | Report spam
Hallo,

ich will eine etwas àltere Funktion aus einer DLL aufrufen. Diese
Funktion in der DLL (unmanaged) gibt ein int Wert zurück und erwartet
zwei Parameter: einen int Wert und ein char*.

Die eigentliche Rückgabe die mich interessiert wird über das char*
zurückgegeben, da hier in (genau) 100 Bytes ein Text geliefert wird.


Ich würde nun gern eine Methode schreiben, die mir den Aufruf kapselt,
so dass ich mit einem String arbeiten kann - bekomme aber das char*
nicht so hin...:

public static String getText (int param) {
String zurueck = null;
char * text = ... // Hier ist mein Problem
if (getText(param,text) == 0) {
zurueck = new String (text); // Das sollte klappen
}
return zurueck;
}

public static unsafe extern int getText (int param, char* text);


Vielen Dank für eure Hilfe
Sebastian
 

Lesen sie die antworten

#1 Thomas Scheidegger [MVP]
16/09/2007 - 14:35 | Warnen spam
Hallo Sebastian

Funktion in der DLL (unmanaged) gibt ein int Wert zurück und erwartet
zwei Parameter: einen int Wert und ein char*.
Die eigentliche Rückgabe die mich interessiert wird über das char*
zurückgegeben, da hier in (genau) 100 Bytes ein Text geliefert wird.



ein char* Parameter in C++ làsst zu viele Interpretationen zu!
Erst ein Aufruf-Beispiel (und/oder Source der DLL Methode) in C++ macht den Fall eindeutig(er).
(Speicher-handling, Nul-Terminierung usw)
Daher ohne Gewàhr, auf eigenes (hohes) Risiko:

Am hàufigsten dürfte die Variante sein, wo der Caller einen Buffer bereitstellt.
In C# wàre dies dann eine mögliche _Interpretation_ mittels StringBuilder, grob:
public static extern int getText (int param, StringBuilder text);
(ggf davor mittels Attribut CharSet=CharSet.Ansi, ist aber auch default).

Aufruf grob:
StringBuilder sb = new StringBuilder( 100 )
int ret = getText ( para, sb );
string txt = sb.ToString();

Beachte, 'probieren' gilt da nicht, sondern erst C++ Doku/Source studieren/posten!
Fehlerhafte PInvoke haben genauso fatale Folgen wie unmanaged C++ Code (Pointer, Leaks uva).




Thomas Scheidegger - MVP .NET - 'NETMaster'
http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/

Ähnliche fragen