ТВИТЕМ ЛПАРАМ для хранения струн

У меня есть список файлов дерева, которые упали на него.

Когда я создаю новый элемент древовидной структуры, я хотел бы сохранить адрес файла в виде строки в этом элементе и позднее извлечь его для различных гнусных целей.

Глядя на Структура ТВИТЕМ в документах Microsoft, видимо LPARAM место для хранения значения:

LPARAM

Type: LPARAM

A value to associate with the item.

Итак, я пошел вперед и сделал это:

TVITEM tvi;
tvi.mask = TVIF_TEXT;
tvi.pszText = const_cast<char *> (str0.c_str());
tvi.cchTextMax = sizeof(tvi.pszText);
tvi.lParam = (LPARAM) foo;  // SETTING LPARAM HERE, foo IS A const char *

TVINSERTSTRUCT tvis;
tvis.item = tvi;
tvis.hInsertAfter = 0;
tvis.hParent = hti0;

// Send message to update tree, and return tree item.
return TreeView_InsertItem(tvw_filelist_, &tvis);

Затем, когда я пытаюсь восстановить свою ценность …

HTREEITEM htiSel = TreeView_GetSelection(tvw_filelist_);

TVITEM tvItem;
tvItem.hItem = htiSel;

TreeView_GetItem(tvw_filelist_, &tvItem);
const char * info = (const char *) tvItem.lParam;
MessageBox(NULL, info, "Alert", MB_OK);

…Я просто получаю мусор, показывая, что мой указатель вышел из области видимости или дремлет или что-то. Размер этого указателя всегда равен 4.

Это правильный способ сделать то, что я пытаюсь сделать? Если так, что происходит?

0

Решение

Конечно, найдите время, чтобы опубликовать вопрос после долгого времени, пытаясь выяснить его, и ответ появится в считанные секунды.

Оказывается, маска TVITEM должна включать TVIF_PARAM, аналогично этот вопрос.

Если я изменю приведенный выше код на:

tvi.mask = TVIF_TEXT | TVIF_PARAM;

это работает как ожидалось.

Я все еще не уверен, является ли это рекомендуемым использованием для LPARAM, все же.

2

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

struct CustomTreeData
{
LPSTR str;   // or even std::string to forget about memory managment
// TODO: any other data you need
};
...
TVITEM tvi;
tvi.mask = TVIF_TEXT | TVIF_PARAM;

CustomTreeData* myDataPtr = new CustomTreeData;   // the memory should be free later
myDataPtr->str = stringWhatIWant;   // And don't forget to alloc memory for str!
tvi.lParam = (LPARAM) myDataPtr;

Я не проверяю этот код, но он должен работать. Удачного кодирования 🙂

2