C++ TVITEM LPRAM用于存储字符串

C++ TVITEM LPRAM用于存储字符串,c++,winapi,treeview,common-controls,lparam,C++,Winapi,Treeview,Common Controls,Lparam,我有一个树状视图,列出了放在上面的文件 当我创建一个新的treeview项目时,我希望将文件的地址作为字符串存储在该项目中,并在以后的某个时间点出于各种恶意目的检索它 查看Microsoft文档中的,显然,LPARAM是存储值的地方: lParam Type: LPARAM A value to associate with the item. 因此,我已经开始这样做了: TVITEM tvi; tvi.mask = TVIF_TEXT; tvi.pszText = const_cast&l

我有一个树状视图,列出了放在上面的文件

当我创建一个新的treeview项目时,我希望将文件的地址作为字符串存储在该项目中,并在以后的某个时间点出于各种恶意目的检索它

查看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);
…我刚刚收到垃圾,表明我的指针超出范围或正在小睡或做其他事情。该指针的大小始终为4


这是做我想做的事的正确方法吗?如果是这样的话,发生了什么事?

当然,在花了很长时间试图弄清楚问题之后,花点时间发布一个问题,答案会在几秒钟内显示出来

TviItem掩码需要包含TVIF_参数,类似于

如果我将上述代码更改为:

tvi.mask = TVIF_TEXT | TVIF_PARAM;
它按预期工作


不过,我仍然不确定这是否是LPARAM的推荐用法。

当然,在花了很长时间试图弄清楚之后,花点时间发布一个问题,答案会在几秒钟内显示出来

TviItem掩码需要包含TVIF_参数,类似于

如果我将上述代码更改为:

tvi.mask = TVIF_TEXT | TVIF_PARAM;
它按预期工作

不过,我仍然不确定这是否是LPRAM的推荐用途

我不检查这个代码,但它应该可以工作。快乐编码:)


我不检查这个代码,但它应该可以工作。快乐编码:)

好吧,这取决于foo是什么。您的代码似乎有点奇怪-如果foo是指向某个文本的指针,那么您存储的是该指针的地址,而不是它指向的数据的地址。(指针的值)是的,这在我的各种实验中是波动的…谢谢,对不起。现在编辑代码。事实证明,这不是主要问题:)好吧,这取决于什么是foo。您的代码似乎有点奇怪-如果foo是指向某个文本的指针,那么您存储的是该指针的地址,而不是它指向的数据的地址。(指针的值)是的,这在我的各种实验中是波动的…谢谢,对不起。现在编辑代码。原来这不是主要的问题:)是的,你可以用它做任何你喜欢的32位的东西。如果是4个字符或整数-很好,就把它们放进去。如果它更大,只需在那里存储一个指向数据的指针。LParam是为任何你喜欢的东西。我过去曾使用它来保存表示用于渲染3d球的材质的结构,该材质显示为列表中每个项目的图像。这样,我就可以使用自定义排序功能对色调、Sat或Lum进行排序,当然也可以对我喜欢的任何其他内容进行排序。:)很高兴您对它进行了排序。我认为您应该将文本字符串“包装”到结构中,并在
LPARAM
中存储指向它的指针,而不是字符串本身。这在将来很有用,然后你决定用一些新参数扩展你的自定义数据。@Axilles-你能做到?!!!!明天要尝试的东西(今天已经8小时了,眼睛在流血)。@Steve Sure。参见下面我的答案。@enhzflep:“您可以[c]使用[
lParam
]任何适合32位的数据”lParam数据类型是指针大小的,即32位系统中的32位,64位系统中的64位。这是一个重要的细节。如前所述,您的评论建议,您只能在32位系统上将指针存储到LPRAM中。是的,您可以将其用于适合32位的任何对象。如果是4个字符或整数-很好,就把它们放进去。如果它更大,只需在那里存储一个指向数据的指针。LParam是为任何你喜欢的东西。我过去曾使用它来保存表示用于渲染3d球的材质的结构,该材质显示为列表中每个项目的图像。这样,我就可以使用自定义排序功能对色调、Sat或Lum进行排序,当然也可以对我喜欢的任何其他内容进行排序。:)很高兴您对它进行了排序。我认为您应该将文本字符串“包装”到结构中,并在
LPARAM
中存储指向它的指针,而不是字符串本身。这在将来很有用,然后你决定用一些新参数扩展你的自定义数据。@Axilles-你能做到?!!!!明天要尝试的东西(今天已经8小时了,眼睛在流血)。@Steve Sure。参见下面我的答案。@enhzflep:“您可以[c]使用[
lParam
]任何适合32位的数据”lParam数据类型是指针大小的,即32位系统中的32位,64位系统中的64位。这是一个重要的细节。如前所述,您的评论表明,您只能在32位系统上将指针存储到LPRAM中。很抱歉在您提供帮助时接受我自己的答案,但我的答案回答了原始问题:)谢谢,尽管+1很抱歉在您提供帮助时接受我自己的答案,但我的答案回答了原始问题:)谢谢,尽管+1
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;