我在树视图中添加了一堆项目,并在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,则在我检查它们均具有lParamfour之后。 (有时,有垃圾值。)

显然这里有一个问题,而且可能真的很容易解决,但是经过几个小时的试验,我找不到问题所在。救命!

最佳答案

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

从MSDN:


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


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

关于c++ - LPARAM在TVITEM中不断变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13302488/

10-11 16:43