textcallback ListView und std::string



  • Hallo zusammen,

    ich speichere in einer Klasse Zeichenketten in einem std::wstring, die in einem ListView eingefügt werden sollen.
    Im LVN_GETDISPINFO Handler bekommt die Liste über eine Schnittstelle einen wchar_t*.

    return const_cast<wchar_t*>(text.c_str());
    

    Funktioniert zwar, ganz wohl dabei ist mir aber noch nicht.
    1. Kann es vorkommen, dass die Liste die Daten beim wchar_t* versucht zu ändern?
    2. Kann es vorkommen, dass die Liste bei wchar_t* liest, ohne vorher eine LVN_GETDISPINFO zu senden?

    Spricht sonst etwas gegen diese Vorgehensweise?

    Dank Ecuh & GRüße...



  • Den const_cast mal ausser Acht gelassen:
    Lebt denn text genug lange?

    Simon



  • text (der wstring) lebt so lange die fensterklasse existiert.
    Allerdings könnte der gecastete wchar_t * ungültig werden, wenn text modifiziert wird. Was wiederum kein Problem wäre, wenn List jedesmal eine LVN_GETDISPINFO sendet bevor es an der Adresse liest.


  • Mod

    Warum verwedndest Du nicht den Speicher der in NMLVDISPINFO angegeben ist und kopierst die Daten da hinein?



  • Der Grund LPSTR_TEXTCALLBACK einzusetzen ist für mich eigentlich das Kopieren von Daten zu verhindern und auf die Originaldaten zuzugreifen.
    Ansonsten könnte ich den string auch per SetItemText übergeben.


  • Mod

    Du hast es nicht verstanden:
    Wenn Du LVN_GETDISPINFO erhältst, dann hat diese Struktur einen gültigen Zeiger auf einen Datenbereich in den Du die Daten hineinkopieren kannst. Dann brauchst Du Dir um die Gültigkeit Deines Zeigers keine Gedanken machen!



  • Mir deucht ich war da tasächlich ein wenig auf der falschen Spur. 😉
    Bei pszText ist bereist cchTextMax Platz reserviert, korrekt?
    Wie ist das( bei Ownerdata Listen), wenn ein Item z.B. durch scrollen nicht mehr sichtbar ist. Wird der Speicher wieder freigegeben?


  • Mod

    Mal ganz ehrlich:
    Glaubst Du nicht auch, dass der Aufrufende, der Dir LVN_GETDISPINFO sendet diese Struktur einfach auf dem Stack anlegt. Da wird gar nichts allokiert!

    1. ListControl will Daten zum anzeigen!
    2. OK Listcontrol sendet Dir LVN_GETDISPINFO
    3. Du füllst die Struktur aus
    4. Listcontrol zeigt aten an
    5. Listcontrol schmeißt Deine Daten auf dem Müll


Anmelden zum Antworten