String als Referenz übergeben



  • Hallo zusammen,

    ich hab folgendes Problem... ich binde in mein C# Projekt zur Laufzeit eine DLL ein, welche in Ansi-C geschrieben wurde.

    Die DllImport-Definition sieht wie folgt aus:

    [DllImport("d:\\Data.dll")]
            public static extern int GetData(string Lines, int iFlags, string Text1, string Text2, string Text3, string media, int modal, string def_string, out string ret_string);
    

    Diese Funktion rufe ich in einer meiner Methoden auf:

    ...
    string sTest = string.Empty;
    ...
    iResult = GetData(m_Values.MESSAGE,
    iFlags,
    m_Values.BUTTON_TEXT_1,
    m_Values.BUTTON_TEXT_2,
    m_Values.BUTTON_TEXT_3,
    m_Values.IMAGE_PATH,
    MODAL,
    m_Values.DEFAULT_INPUT_TEXT,
    out sTest);
    
    ...
    

    Sinn dieser Funktion ist es, dass man ihr mehrere Texte übergibt und diese daraufhin ein Dialogfenster mit diesen Texten zusammenstellt und anzeigt. Der User hat in diesem Dialog die Möglichkeit, eine Eingabe in ein Editfeld zu machen. Dieser Resultstring sollte dann wieder nach dem Beenden des Dialogs der aufrufenden Funktion zur Verfügung stehen. Hier in meinem Beispiel in der Variable "sTest". Leider steht der entsprechend eingetragenen Text nicht drin!!

    Hier noch der Ausschnitt der Ansi-C DLL:

    [cpp]

    int __stdcall __export GetData(char *Lines, int iFlags, char *Text1, char *Text2, char *Text3, char *bmp_name, int modal, char *def_string, char *ret_string)
    {
    ...
    //INITIALIZE STATIC/GLOBAL VARIABLES
    panAskuData = 0;
    gbTaste = ABORT_KEY;
    key_pressed = 0;
    gModal = 0;
    gQuitUserCalled = 0;
    gAllowedButtons = 0;
    gReturnString = ret_string; // copy pointer to global variable
    ...

    }

    [/cpp]

    Ich denke, dass hier wichtig ist, dass der ret_string der variable "gReturnString" kopiert wird, die als

    static char *gReturnString = 0;
    

    global definiert ist!

    Meine Frage ist nun, wie ich nach Aufruf der Funktion an den Text herankomme? Habt ihr da eine Lösung? Ich habe mit "ref" und "out" gearbeitet... aber bis jetzt keine passende Lösung gefunden.

    Vielen Dank für eure Hilfe!



  • Benutze StringBuilder um einen beschreibbaren String via P/Invoke in eine DLL zugeben.



  • Hi theta,

    habe nun ein StringBuilder in versch. Kombinationen genutzt...

    (..., StringBuilder ref_string)
    (..., ref StringBuilder ref_string)
    (..., out StringBuilder ref_string)

    nur leider bekomme ich nie den String zurückgeliefert!!!
    Glaubst du das kann was mit dem umkopieren in der Ansi-C DLL zusammenliegen?

    Irgendwie kommt es mir so vor, dass er nach dem umkopieren:

    gReturnString = ret_string; // copy pointer to global variable
    

    in der unmanaged Seite irgendwie nicht den richtigen Speicherbereich übergibt. Kann das sein? Habt ihr vll. noch einen Tipp?

    Danke!





  • 1. Um den string zu kopieren kannst Du nicht einfach die Poiner zuweisen. Du musst z.B. strcpy benutzen.
    2. Ich denke ret_string ist der Zielstring, oder? Dann musst Du ist

    gReturnString = ret_string
    

    verkehrt rum (ganz abgesehen von Punkt 1).


  • Administrator

    Zudem musst du im StringBuilder genügend Speicher im voraus reservieren. StringBuilder bietet dazu einen Konstruktor an.

    Also zusammengefasst:

    1. StringBuilder mit genügend Speicherplatz erstellen.
    2. StringBuilder Objekt übergeben ohne out , ref oder sonstwas.
      3. In der C Funktion die Sache mit strcpy , strncpy oder ähnliches kopieren. Zeigerzuweisung bringt da überhaupt gar nichts.
      4. Dich ab dem Text erfreuen.

    Grüssli


Anmelden zum Antworten