LPARAM постоянно меняется в ТВИТЕМ

Я добавляю кучу элементов в древовидную структуру со строкой, хранящейся в 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, (Иногда значения мусора.)

Здесь, очевидно, есть проблема, и, вероятно, ее действительно легко исправить, но после нескольких часов экспериментов я не могу найти, что не так. Помогите!

0

Решение

tvi.lParam = (LPARAM) add0.c_str(); это проблема. tvi.lParam тип указателя

ОТ MSDN:

LPARAM Этот тип объявлен в WinDef.h как показано ниже: typedef LONG_PTR
LPARAM;

что такое add0? Я думаю, это локальная переменная. Если функция возвращает, это add0 Вар будет деконструирован, и tvi.lParam указывает на интер бафф строки add0и теперь этот интер-бафф освобожден, так что tvi.lParam указывает на мусор.

3

Другие решения

Вы храните адрес в tvi.lParam, Это адрес строки add0,

Если add0 выходит из области видимости, тогда адрес становится недействительным. По этой причине вы видите разные значения.

Вы должны назначить tvi.lParam адрес, который всегда доступен. Сделайте строку глобальной переменной или переменной члена класса.

Опять же, вам понадобится одна строка для каждого узла дерева. Таким образом, вам нужно будет поддерживать массив строк. Если у вас есть только одна строка, то один и тот же адрес будет иметь другое значение, как вы наблюдаете в случае раз, два, три, четыре.

Благодарю.

0

По вопросам рекламы [email protected]