mehrmalig CString zu char-Zeichenkette
-
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 DLLWenn 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...