mehrmalig CString zu char-Zeichenkette
-
Es werden mords viele Parameter übergeben und in Form mehrerer Strukturen und Variablen an die DLL-Funktion übergeben.
Ein Thread, der da im gleichen Programm läuft, ist mir nicht bekannt.
Es funktioniert übrigens auch, wenn ich die XPath-Angaben fest verdrahtet übergebe, also so:
dllParam1 = "blablubb"; dllParam2 = "tach"; dllParam3 = "simsalabim"; // hier Aufruf der DLL-Funktion[edit] Mmhh, der letzte Hinweis ist woh nicht besonders hilfreich bei der Problemlösung. Mit drei char-Variablen funktioniert es ja auch...

[/edit]
-
Das hier funktioniert auch (hattest du das gemeint?)?
isabeau schrieb:
dllParam1 = "blablubb"; tmp=dllParam1; // hier Aufruf der DLL-Funktion mit tmp dllParam2 = "tach"; tmp=dllParam2; // hier Aufruf der DLL-Funktion mit tmp dllParam3 = "simsalabim"; tmp=dllParam3; // hier Aufruf der DLL-Funktion mit tmpEDIT: Hier ist tmp dann natürlich ein char*...

EDIT2: Also ich glaube an die Thread-Theorie. Alles andere macht für mich keinen Sinn. Pack doch mal hinter jeden DLL-Aufruf ein großes Sleep. Wird's dann besser?
-
Nein, das war nicht gemeint.
"fest verdrahtet" heisst, ich brauch keine char-Variable, die den Inhalt meiner CString-Variablen aufnimmt, wiel ich diesen Inhalt direkt an die Parameter/Struktur der DLL übergebe.
dllParam1 = "blablubb";
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!!!
Also muss ich den Umweg über eine char-Variable machen.Edit:
es gibt nur einen DLL-Aufruf zum Schluss. Alles andere sind Parameterübergaben.
-
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 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...