DllImport -- Referenz auf einen String übergeben

Hallo,

ich möchte einer Funktion, die sich in einer Dll befindet eine Referenz auf einen String übergeben, der in der besagten Funktion gefüllt/ geändert werden soll. Die Dll erstelle ich selbst unter VC++ 6.0.

Die Funktion habe ich wie folgt definiert:

EXPORT int CALLBACK tbl\_devices(LPSTR device)

Unter VS2005 binde ich die Funktion wie folgt ein:

[DllImport("aaa.dll")]
private static extern int tbl\_dev(StringBuilder dev);

Dann rufe ich die Funktion auf

StringBuilder dev = new StringBuilder("test",4);
int cntDevs = tbl\_dev(dev);
string test = dev.ToString();

Obwohl der String in der Dll- Funktion geändert wird, kommt diese Änderung in meinem C#- Prg nicht an.

Wie übergebe ich eine Referenz auf einen String?
Hab auch schon mit „ref string dev“ erfolglos getestet und bin dann auf den StringBuilder gestoßen. Allerdings auch ohne Erfolg.

Hat jemand ne Idee, wo der Fehler liegt?

Hallo!

Belies’ Dich vielleicht mal hier:
http://msdn2.microsoft.com/de-de/library/fzhhdwae.aspx
Da gibt es alle möglichen Beschreibungen für die Übergabe von Parametern bei P/Invoke-Aufrufen.

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Martin,

danke für die Antwort. Habs hinbekommen. In der Dll erwarte ich jetzt einen Pointer auf eine Zeichenkette:

...(char\*\* device, ...)

und übergebe in meinem C#- Prg eine Referenz auf einen String.

...(ref string device, ...)

Gruß
ziba

Na fein…
Du denkst auch daran, dass Du unter .NET einen Garbage-Collector hast und die Adresse der String-Referenz nicht unbedingt immer gleich bleibt, ja?
Sonst kann’s nämlich sein, dass Dir Deine C+±Dll abschmiert, weil .NET den String mittlerweile verlegt hat.
Stichwort für die Suche: „Pinning“.

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Na fein…
Du denkst auch daran, dass Du unter .NET einen
Garbage-Collector hast und die Adresse der String-Referenz
nicht unbedingt immer gleich bleibt, ja?
Sonst kann’s nämlich sein, dass Dir Deine C+±Dll abschmiert,
weil .NET den String mittlerweile verlegt hat.
Stichwort für die Suche: „Pinning“.

Gruß,
Martin

Hallo Martin,
danke für den Tip. Das Problem hatte ich gar nicht bedacht. Hab mich mal belesen und bin auf fixed und unsafe gestoßen. Allerdings hab ich Probleme bei der Umsetzung in meinem Projekt.
Ich erwarte in meiner Dll- Funktion eine Referenz auf eine Zeichenkette (char** …). In C# hab ich bisher eine Referenz auf einen String übergeben (ref string …). Damit in C# ein Objekt vom GC nicht verschoben wird, muss das Ganze durch fixed geschützt werden. Allerdings muss im fixed- Statement ein Pointer- Typ stehen und da von Managed Types wie strings lt. Compiler keine Adressen ermittelt werden können, muss ein anderer Datentyp her. Hab mich für char** entschieden, also ein Zeiger auf eine Zeichenkette. Im fixed- Statement muss mein char** aber initialisiert werden, aber wie? Genauso hab ich dann Probleme mit dem char** weiterzuarbeiten.
Häng an der Stelle grade fest. Jemand noch ne bessere Idee oder nen Tip, wie ich ne Referenz auf meinen String auf sichere Weise an meine Dll übergebe?

Danke & Gruß
ziba

Hi nochmal!
Vermutlich musst Du noch nicht mal mit unsafe-Blöcken arbeiten.
Schau’ Dir evtl. mal GCHandle an, damit kann man dafür sorgen, dass verwaltete Objekte über einen bestimmten Zeitraum hinweg nicht aufgeräumt oder verschoben werden.

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]