Typkonvertierung CString -> LPSTR
-
wie kann ich eine Variable von CString in einen LPSTR-Typ umwandeln. Das Problem hab ich bei folgendem Code:
CFileFind find; CString name; find.FindFile(NULL, 0); for (int i=0; i<10; i++) { find.FindNextFile(); name = find.GetFileName(); tvItem.pszText = (LPSTR)name; tvInsert.item = tvItem; m_treeView.InsertItem(&tvInsert); }
Das casten funktioniert hier irgendwie nicht
-
Guten Morgen,
Also die Klasse CString bietet die Methode
CString::GetBuffer(int nMinBufferLength)
an.
Für dein Beispiel:
[cpp]
CFileFind find;
CString name;find.FindFile(NULL,0);
for(int i = 0; i <= 10; i++)
{
find.FindNextFile();
name = find.GetFileName();
tvItem.pszText = name.GetBuffer(0);
tvInsert.item = tvItem;
m_treeView.InsertItem(&tvInsert);
}
[/cpp]MfG
Nocadas
-
Mit den bescheuerten Umwandlungen hatte ich auch immer Probleme..
Bis ich diese Seite im Netz gefunden hab.
http://www.codeproject.com/cpp/data_conversions.aspM.f.G. MasterGandi
-
Die Klasse CString bietet aber auch die Methode
ReleaseBuffer
Diese muss aufgerufen werden wenn der Buffer nicht mehr benötigt wird.
Diesen Aufruf vermisse ich im oberen Code.
-
Wenn du zu 100% sicher bist, dass der String nicht verändert wird, kannst du folgendermaßen casten:
[cpp] CFileFind find;
CString name;find.FindFile(NULL, 0);
for (int i=0; i<10; i++)
{
find.FindNextFile();name = find.GetFileName();
tvItem.pszText = (LPSTR) (LPCSTR) name;
tvInsert.item = tvItem;m_treeView.InsertItem(&tvInsert);
} [/cpp]In diesem Fall ist das OK, weil CTreeCtrl::InsertItem den Text nur ausliest.
Allerdings hat CTreeCtrl auch noch eine andere InsertItem-Funktion, die einen LPCTSTR als Text nimmt, das sähe dann so aus:
CFileFind find; CString name; find.FindFile(NULL, 0); for (int i=0; i<10; i++) { find.FindNextFile(); name = find.GetFileName(); CTreeCtrl *treectrl = m_treeView.GetTreeCtrl(); // so eine Funktion bräuchtest du dann noch treectrl->InsertItem(name); }
-
Moin,
Was passiert denn, wenn man NICHT
CString::ReleaseBuffer()
aufruft?
MfG
Nocadas
-
Was passiert denn, wenn man NICHT CString::ReleaseBuffer() aufruft?
Laut Doku ist das Verhalten undefiniert. Wenn er also deiner Mutti Pornomails schickt und dann deine Festplatte formatiert, geschieht Dir das nur recht :p
Wenn ich mich an die Implementation richtig erinnere, nicht viel schlimmes. Kein Leak, nur das Buffer wird bei den meisten anderen Aufrufen ungültig.
-
Tach,
LOL^^ na wenns weiter nichts ist :P.
Dann schön ReleaserBuffer() aufrufen^^. Sonst sende ich noch SMS-Bomben an Bill Gates^^.
Da wird grad beim Releasen sind^^. Ich nehmen an:
CStringArray *ErsterStringArray=new CStringArray;
wird so gelöscht:
delete ErsterStringArray;
Und da wäre noch ne Frage:
Ich speichere Offset-Werte einer Datei in einen CStringArray...also CString.
Mit
CString::Format("%d",bla);
bekomm ich das dingen rein, nur wie wieder heraus?
Vielleicht:
int Offset; CString Str; Str=ErsterStringArray->GetAt(x); Offset=atof(Str);
MfG
Nocadas