PInvoke char * Probleme

Tobias500

Mitglied
Da ich nun die Gelegenheit habe mich in einem Praktikum an einem Windowsprogramm zu versuchen,. möchte ich gerne c# verwenden. Da ich zugriff auf einige Dll's benötige habe ich einige Tests mit PInvoke unternommen. An einem Problem scheitere ich im Moment. Ich schaffe es einfach nicht den String aus der dll in mein Programm zu importieren. Das Ergebniss ist immer ein leerer String. Ich habe schon X verschiedene Möglichkeiten ausprobiert, und schon einige Zeit (2 Stunden) im Internet nach einer Lösung gesucht, aber die Lösungsvorschläge die ich gefunden habe beschäftigten sich mit der Frage des Imports eines Strings in eine DLL und nicht mit der eines Exports. Ihr seid meine letzte Rettung, sonst muss ich mit der MFC arbeiten, und das dies frustierend ist wisst Ihr genauso gut wie Ich.

Gruß Tobi

Hier mein kleiner Testcode:

in der C# TestRoutine:
[DllImport ("p_invoke_testlib.dll")]
public static extern void String_out( [MarshalAs(UnmanagedType.LPTStr) ]
ref StringBuilder s);
in der DLL der Code:
export void String_out(char * s)
{
s = new char[20];
sprintf(s,"%s","Hallo aus der DLL");
}
 
Hallo!

Schau doch mal in den [thread=192833]Thread[/thread]. Die hatten, glaube ich, das gleiche Problem.
Ob's jetzt bei Dir hilft kann ich nicht sagen.

MfG cosmo
 
Hallo cosmochaosmaker Danke für deinen Hinweis,

leider konntest du mir nicht helfen, aber, ich habe die Lösung nach etlichen Versuchen ( und nach Studium der MSDN ) gefunden. Als erstes war ein Fehler in der DLL. Ich verändere ja den Zeiger durch die Allokierung von Speicher mittels der new Anweisung, so dass C# gar nicht weiss, wo sich nun der richtige String befindet. Also :

export void String_out(char * s,int length)
{
sprintf(s,"%s","Hallo aus der DLL");
}
so ist es jetzt richtig, Natürlich fehlt in der DLL noch die Auswertung der Stringlänge, soll ja nur ein Test sein.


Die Minimallösung der PInvoke Anweisung:

[DllImport("p_invoke_testlib.dll")]
public static extern void String_out(
[In,Out] StringBuilder s,int length);

Charset Ansi und MarshalAs(LPStr) könnte man noch hinzunehmen, muss man aber nicht

G. Tobi
 
Zurück