Я добавляю кучу элементов в древовидную структуру со строкой, хранящейся в lParam
, как это:
TVITEM tvi = {sizeof(TVITEM)};
tvi.mask = TVIF_TEXT | TVIF_PARAM;
tvi.pszText = const_cast<char *> (txt0.c_str()); // Display text
tvi.cchTextMax = sizeof(tvi.pszText);
tvi.lParam = (LPARAM) add0.c_str(); // A file path string
TVINSERTSTRUCT tvis;
tvis.item = tvi;
tvis.hParent = hti0; // Some parent node
TreeView_InsertItem(tvw_filelist_, &tvis);
После того как я закончу добавлять их все, я возвращаюсь и проверяю (в другой функции):
TVITEM tvi = {sizeof(TVITEM)};
char buf[200];
tvi.pszText = buf;
tvi.cchTextMax = 200;
tvi.hItem = htiTemp; // htiTemp is the current node in the iteration
tvi.mask = TVIF_TEXT | TVIF_PARAM;
// Retrieve; address is stored in lParam.
TreeView_GetItem(tvw_filelist_, &tvi);
char out[200];
strcpy(out, "Checking: PSZTEXT: ");
strcat(out, tvi.pszText);
strcat(out, ". LPARAM: ");
strcat(out, (const char *) tvi.lParam);
…и LPARAM был сброшен до значения последнего добавленного элемента.
Итак, если я добавлю предметы one, two, three, four
с похожими lParam
значения, то после того, как я проверю, они все имеют lParam
из four
, (Иногда значения мусора.)
Здесь, очевидно, есть проблема, и, вероятно, ее действительно легко исправить, но после нескольких часов экспериментов я не могу найти, что не так. Помогите!
tvi.lParam = (LPARAM) add0.c_str();
это проблема. tvi.lParam
тип указателя
ОТ MSDN:
LPARAM Этот тип объявлен в WinDef.h как показано ниже: typedef LONG_PTR
LPARAM;
что такое add0
? Я думаю, это локальная переменная. Если функция возвращает, это add0
Вар будет деконструирован, и tvi.lParam
указывает на интер бафф строки add0
и теперь этот интер-бафф освобожден, так что tvi.lParam
указывает на мусор.
Вы храните адрес в tvi.lParam
, Это адрес строки add0
,
Если add0
выходит из области видимости, тогда адрес становится недействительным. По этой причине вы видите разные значения.
Вы должны назначить tvi.lParam
адрес, который всегда доступен. Сделайте строку глобальной переменной или переменной члена класса.
Опять же, вам понадобится одна строка для каждого узла дерева. Таким образом, вам нужно будет поддерживать массив строк. Если у вас есть только одна строка, то один и тот же адрес будет иметь другое значение, как вы наблюдаете в случае раз, два, три, четыре.
Благодарю.