0

我将一堆项目添加到树视图中,其中存储了一个字符串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. (有时,会有垃圾值。)

这里显然有问题,而且可能很容易修复,但经过几个小时的试验,我找不到问题所在。帮助!

4

2 回答 2

3

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

来自 MSDN:

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

什么是add0?我猜这是一个局部变量。如果函数返回,这个add0var 将被解构,并tvi.lParam指向 string 的 inter buff add0,现在这个 inter buff 被释放,所以tvi.lParam指向垃圾。

于 2012-11-09T05:27:04.763 回答
0

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

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

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

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

谢谢。

于 2012-11-09T05:31:13.863 回答