LPARAM在TVITEM中不断变化

时间:2012-11-09 05:19:32

标签: c++ winapi pointers treeview 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。 (有时候,有垃圾值。)

这里显然存在一个问题,它可能很容易修复,但经过几个小时的实验后我找不到什么问题。救命啊!

2 个答案:

答案 0 :(得分:3)

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

来自MSDN:

  

LPARAM此类型在WinDef.h中声明如下:typedef LONG_PTR   LPARAM;

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

答案 1 :(得分:0)

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

如果add0超出范围,则地址无效。这就是你看到不同价值的原因。

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

同样,每个树节点都需要一个字符串。所以你需要维护一个字符串数组。如果您只有一个字符串,则相同的地址将具有不同的值,就像您在一,二,三,四的情况下观察一样。

感谢。