mehrmalig CString zu char-Zeichenkette



  • isabeau schrieb:

    Das bringt es nicht, weil der Inhalt ja nun mal nicht fest steht, sondern in einer CString-Variablen drin steht, die ich aber nicht übergeben kann:
    CString strTxt1 = "blablubb";
    dllParam1 = strTxt1; // keine geeignete Konvertierung möglich!!!

    Das könntest du mit GetBuffer machen. ReleaseBuffer brauchst du auch nicht, wenn der String nicht geändert wird. Wenn du also sowieso alles fertig in CStrings hast, dann könntest du die einfach per GetBuffer übergeben. Wenn sich so ein CString allerdings auch kurz nach dem Aufruf ändert, dann hast du vermutlich wieder dasselbe Problem...



  • Scheint jetzt zu klappen...
    Um mal mein obiges Beispiel umzubauen:

    CString strTxt1 = "blablubb"; 
    CString strTxt2 = "tach"; 
    CString strTxt3 = "simsalabim"; 
    
    dllParam1 = strTxt1.GetBuffer(strTxt1.GetLength());
    dllParam2 = strTxt2.GetBuffer(strTxt2.GetLength());
    dllParam3 = strTxt3.GetBuffer(strTxt3.GetLength());
    

    Sieht auch irgendwie schöner aus 😃
    Vielen Dank.



  • Ich glaube, GetLength kannst du dir auch sparen. Dann sieht's noch schöner aus. 😉



  • Zu früh gefreut...
    Die DLL meckert zwar nicht, aber in dem XML-Dokument, dass sie mir erzeugt, steht an der entsprechenden Stelle Grütze drin:

    Target="ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝ?"

    Und bei

    dllParam1 = (LPCTSTR)strTxt1.GetBuffer(strTxt1.GetLength());

    sagt er mir
    'const char *' kann nicht in 'char *' konvertiert werden



  • CString strTxt1 = "blablubb"; 
    CString strTxt2 = "tach"; 
    CString strTxt3 = "simsalabim"; 
    
    char tmp[500]; 
    
    strcpy(tmp, strTxt1); 
    dllParam1 = tmp; 
    // hier Übergabe von dllParam1 an die DLL 
    
    strcpy(tmp, strTxt2); 
    dllParam2 = tmp; 
    // hier Übergabe von dllParam2 an die DLL 
    
    strcpy(tmp, strTxt3); 
    dllParam3 = tmp; 
    // hier Übergabe von dllParam3 an die DLL
    

    Wenn die Dll-Funktion erst am Ende des Quellcode-Schnipsels aufgerufen wird

    function(dllParam1, dllParam2, dllParam3);
    

    dann ist das gleichzusetzen mit

    function(tmp, tmp, tmp);
    

    und entspricht eigentlich

    function(strTxt3, strTxt3, strTxt3);
    

    Wenn Du immer einen Zeiger auf den gleichen Puffer verwendest, dann zeigen alle Parameter auf den aktuellen Inhalt. Und das ist in diesem Fall strTxt3.



  • Also...
    ich habe hier eine eigene Klasse DOKUMENT. Deren Parameter müssen gefüllt werden (alles Angaben zu diesem Dokument). Und dann wird das Dokument an die DLL übergeben.

    Z.B.:
    DOKUMENT[1].xmlKnoten = "Pfadangabe";

    Und der will eben unbedingt eine char-Zeichenkette.
    So wie oben geht, ist aber nicht variabel. Eine CString-Variable statt "Pfadangabe"

    DOKUMENT[1].xmlKnoten = strTxt1;

    erzeugt den Fehler

    error C2679: Binaerer Operator '=' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'class CString' akzeptiert (oder keine geeignete Konvertierung moeglich)

    Mache ich den Umweg mit
    char tmp[500];
    strcpy(tmp, strTxt1);
    DOKUMENT[1].xmlKnoten = tmp;

    funktioniert das beim ersten Mal. Wenn ich tmp noch mal mit
    strcpy(tmp, strTxt2);
    benutzen will, kommt die Fehlermeldung, dass der Knoten eine ungültige Pfadangabe aufweist.
    Wenn ich für jeden Knoten eine neue char-Variable erstelle und nur einmal benutze geht das auch, kommt mir aber viel zu aufwendig vor, das muss doch auch mit einer funktionieren...

    Und

    DOKUMENT[1].xmlKnoten = strTxt1.GetBuffer(strTxt1.GetLength());

    erzeugt keine Fehler, aber in der erzeugten XML-Datei steht teilweise Speichermüll. Als wäre die Zeichenkette nicht terminiert oder sowas...



  • isabeau schrieb:

    Mache ich den Umweg mit
    char tmp[500];
    strcpy(tmp, strTxt1);
    DOKUMENT[1].xmlKnoten = tmp;

    funktioniert das beim ersten Mal. Wenn ich tmp noch mal mit
    strcpy(tmp, strTxt2);
    benutzen will, kommt die Fehlermeldung, dass der Knoten eine ungültige Pfadangabe aufweist.
    Wenn ich für jeden Knoten eine neue char-Variable erstelle und nur einmal benutze geht das auch, kommt mir aber viel zu aufwendig vor, das muss doch auch mit einer funktionieren...

    Wie denn, wenn jeder Knotentext unterschiedlich ist? dllParam1-3 zeigen doch immer auf den gleichen Puffer, egal was Du da immer hineinkopierst. Am Ende gewinnt der letzte Inhalt, und der ist nun einmal der von strTxt3. Deshalb auch die Fehlermeldung mit der fehlerhaften Pfadangabe.

    Probiere mal folgendes:

    DOKUMENT[1].xmlKnoten = const_cast<LPSTR>(strTxt1.GetString());
    DOKUMENT[2].xmlKnoten = const_cast<LPSTR>(strTxt2.GetString());
    DOKUMENT[3].xmlKnoten = const_cast<LPSTR>(strTxt3.GetString());
    

    Geht aber nur, wenn die Anwendung nicht als Unicode kompiliert wird.



  • sri schrieb:

    dllParam1-3 zeigen doch immer auf den gleichen Puffer

    Argh, das ist wohl der Fehler, den ich nicht gesehen habe!

    Und statt .GetString() meinst du doch bestimmt .GetBuffer(...) oder?
    Erzeugt auch keine Fehler, aber wieder Speichermüll in der XML-Datei.

    Aber wenigstens meine ich jetzt zu wissen, WO der Fehler liegt und kann da weiter machen, danke schön.



  • Nein, ich meinte schon GetString. Das gibt einen LPCTSTR-Zeiger auf die Zeichenkette zurück.

    Existieren die CString-Objekte denn während des gesamten Funktionsaufrufs?



  • Da kommt bei mir
    error C2039: 'GetString' : Ist kein Element von 'CString'

    Vielleicht sollte ich an dieser Stelle erwähnen, dass ich mit Visual C++ 6.0 arbeite...

    Und die CString-Objekte existieren, das sind Membervariablen der Klasse. Die werden vorher mit aktuellen Daten befüllt und dann an die DLL übergeben.



  • GetString gibt es in der MFC vom VC6 leider noch nicht.



  • Ich mache erstmal mit meinen extra-char-Variablen weiter.
    Es funktioniert ja jetzt wenigstens, und eine schöner Lösung suche ich, wenn mal mehr Zeit ist...


Anmelden zum Antworten