Announcement

Collapse
No announcement yet.

Probleme bei der String.Umsetzung in C# von einer Funktion aus C++

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme bei der String.Umsetzung in C# von einer Funktion aus C++

    Hallo C#-User,

    ich habe ein Problem, dass ich dringend lösen muss.

    Ich rufe über den DLLImport eine Funktion aus einer externen DLL auf. Scheint soweit auch zu funktionieren. Nur liefert mir die gewünschte Funktionen keinerlei Werte, auch wenn die Rückgabe der Funktion den "ReturnCode = 0 = kein Fehler aufgetreten" liefert.

    Ich vermute, dass es mit der unterschiedlichen String-Behandlung zwischen C++ und C# im Zusammenhang steht.

    Die Orgininalbeschreibung stellt folgendes dar:

    ---

    Parameter "ReturnValue"

    Speicherbereich ( Mindestgröße 3000 Byte ) zur Rückgabe der Informationen. Dieser Speicherbereich muss mit Blanks vorbelegt und mit NULL 0x00 terminiert werden.

    ---

    Gelöst habe ich das in C# mit folgender Vorgehensweise:

    string returnCode = new String(' ', 3000) + "\0";

    Leider ist der String leer nach Aufruf der Funktion. Hat jemand eine Ahnung, woram das liegen könnte?

    Gruß
    jlo

  • #2
    Hallo,

    die String-Klasse von .NET ist immutable, d.h. eine Änderung des Inhalt ist nicht möglich (hinter den Kulissen wird eine neue Instanz angelegt und der "alte" Wert mit dem zusammengeketteten neuen Wert hineinkopiert).

    Im Fall von DllImport (P/Invoke) ist statt dessen die <b>StringBuilder</b>-Klasse für den Datenaustausch zuständig, wenn die externe DLL-Funktion den Wert ändert.

    Ein Beispiel könnte so aussehen:
    <pre>
    [DllImport("Kernel32", CharSet = CharSet.Auto)]
    static extern Int32 GetShortPathName(
    String path, // input string
    StringBuilder shortPath, // output string
    Int32 shortPathLength); // StringBuilder.Capacity
    </pre>

    &gt;Speicherbereich ( Mindestgröße 3000 Byte ) zur Rückgabe der Informationen...

    Warum müssen sich die C++-Leute immer solche Sachen einfallen lassen ;-)
    &#10

    Comment


    • #3
      Hallo Andreas Kosch,

      sorry für die verspätete Reaktion. Ich musste erstmal tüfteln...

      Also "StringBuilder" war das korrekte Zauberwort!!! Definiert man den String wie folgt, funktioniert das Ganze...

      <PRE>
      System.Text.StringBuilder myReturn = new StringBuilder(3000, 5000);

      myReturn.Append("".PadRight(3000));

      myReturn.Append("\0");
      </PRE>

      Danke für den Tipp!!

      Gruß
      jl

      Comment

      Working...
      X