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