Lparam不断变化TVITEM

LPARAM keeps changing in TVITEM

本文关键字:TVITEM 变化 Lparam      更新时间:2023-10-16

我正在将一堆项目添加到树视图中,并在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已重置为添加的最后一项的值。

因此,如果我添加具有类似lParam值的项目one, two, three, four,则在我检查它们都具有fourlParam之后。(有时,有垃圾值。)

这里显然有一个问题,这可能真的很容易解决,但是经过几个小时的实验,我找不到问题了。帮助!

tvi.lParam = (LPARAM) add0.c_str();这是问题。 tvi.lParam是指指针类型。

来自msdn:

lparam这种类型在windef.h中声明为:typedef long_ptr lparam;

什么是add0?我想这是一个局部变量。如果函数返回,则该add0 var将被解构,并且tvi.lParam指向字符串add0的buff,现在释放了此buff,因此tvi.lParam指向垃圾。

您在tvi.lParam中存储一个地址。这是字符串add0的地址。

如果 add0不在范围内,则地址将变得无效。这就是您看到不同值的原因。

您必须分配tvi.lParam始终可用的地址。使字符串成为全局变量或类成员变量。

再次,您需要每个树节点一个字符串。因此,您需要维护一系列字符串。如果您只有一个字符串,那么相同的地址将具有不同的值,就像您在一个,二,三,四。

的情况下观察到一样

谢谢。