Problem mit LB_SETITEMDATA



  • Hallo Leute,
    ich hab da ein kleines Problemchen mit einer Funktion, dessen Rückgabewert vom
    Typ String ist und der Nachricht LB_SETITEMDATA, die ich an eine Listbox in
    meinem Fenster sende:

    Beispiel: Meine Funktion

    string sFunktion
    {
    	[...]
    	return "halloduda";
    }
    

    Nun füge ich einem Element in meiner Listbox per

    SendMessage(hListFiles, LB_SETITEMDATA, iItem, (LPARAM) sFunktion().c_str())
    

    den Rückgabewert der Funktion "sFunktion", also "halloduda" als const char * hinzu - doch wenn ich später im Programm den Inhalt des Elements in meiner Listbox mit

    const char *pIn;
    	pIn = (const char*)SendMessage(hListFiles, LB_GETITEMDATA, SendMessage(hListFiles, LB_GETCURSEL, 0, 0), 0);
    
    	MessageBox(0, pIn, 0, 0);
    

    abfrage, erscheint nur Müll in meiner MessageBox.

    Es funktioniert alles, wenn ich "halloduda" direkt an das Element sende, also

    const char *pInhalt = "halloduda";
    SendMessage(hListFiles, LB_SETITEMDATA, iItem, (LPARAM) pInhalt;
    

    Hoffe, ihr könnt mir helfen 👍
    -crazychicken



  • Ich nehme mal an, dass der Pointer, den sFunktion().c_str() zurückliefert eben nur begrenzt gültig ist. Das würde bedeuten, dass du die Daten aus dem String kopieren müsstest. Oder warum nicht direkt einen Pointer auf den String (also nicht das char-Array) übergeben und dann erst nach LB_GETITEMDATA c_str() anwenden? 🙂



  • Ähm ich habe jetzt mal versucht, einen Pointer auf den String mit

    SendMessage(hListFiles, LB_SETITEMDATA, iItem, (LPARAM) (string*)&sFunktion())
    

    und

    string *sIn = (string*)SendMessage(hListFiles, LB_GETITEMDATA, SendMessage(hListFiles, LB_GETCURSEL, 0, 0), 0);
    MessageBox(0, (*sIn).c_str(), 0, 0);
    

    zu übergeben - doch es wird leider wieder nur "Müll" ausgegeben oder das Programm stürzt ab...
    (Vielleicht liegt's auch daran, dass ich bisher wenig mit Zeigern gearbeitet habe 🙄 )

    thx
    -crazychicken



  • Das liegt wohl einfach daran, dass der String eben nach der nächsten } nicht mehr gültig ist - du musst ihn also irgendwoe zwischenspeichern, wo du von beiden Stellen aus zugreifen kannst (sprich: in einem übergeordneten Blogg oder ggf. global, evtl. auch static)



  • Ok, habe das Problem jetzt einfach mit einem statischen String gelöst:

    static string ssFunktion = sFunktion();
    SendMessage(hListFiles, LB_SETITEMDATA, iItem, (LPARAM)(string*)&ssFunktion);
    

    -hauptsache, ich komme erstmal weiter mit meinem Programm..

    Vielen Dank!
    -crazychicken


Anmelden zum Antworten