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.asp

    M.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


Anmelden zum Antworten