C++ LPRAM在TVTItem中不断变化

C++ LPRAM在TVTItem中不断变化,c++,winapi,pointers,treeview,lparam,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();

我正在向树视图添加一组项目,其中一个字符串存储在
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);
…并且LPRAM已重置为最后添加项的值

因此,如果我添加具有类似
lParam
值的
1、2、3、4
项,那么在我检查之后,它们都具有
lParam
4
。(有时会出现垃圾值。)

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

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

从MSDN:

LPARAM该类型在WinDef.h中声明如下:typedef LONG\u PTR LPARAM

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

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

从MSDN:

LPARAM该类型在WinDef.h中声明如下:typedef LONG\u PTR LPARAM


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

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

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

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

同样,每个树节点都需要一个字符串。因此,您需要维护一个字符串数组。如果只有一个字符串,那么同一个地址将有不同的值,就像您在1、2、3、4的情况下观察到的那样


谢谢。

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

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

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

同样,每个树节点都需要一个字符串。因此,您需要维护一个字符串数组。如果只有一个字符串,那么同一个地址将有不同的值,就像您在1、2、3、4的情况下观察到的那样


谢谢。

你说得很对,这是本地的。谢谢你的提示-有关于修复它的建议吗?请同时检查txt0:tvi.pszText=const_cast(txt0.c_str());//我本想问一下,但我没有注意到任何奇怪的行为。这也是一个指针,对吗?tvi.lParam=(lParam)_strdup(add0.c_str()),这将分配内存并复制字符串。记住在使用完treeviewThanks后调用免费的tvi.lParam,这很有效!确认一下,您的意思是调用
void free(void*ptr)
在所有
lParam
s上,如果在应用程序销毁之前丢弃了treeview?你完全正确,它是本地的。谢谢你的提示-有关于修复它的建议吗?请同时检查txt0:tvi.pszText=const_cast(txt0.c_str());//我本想问一下,但我没有注意到任何奇怪的行为。这也是一个指针,对吗?tvi.lParam=(lParam)_strdup(add0.c_str()),这将分配内存并复制字符串。记住在使用完treeviewThanks后调用免费的tvi.lParam,这很有效!确认一下,您的意思是调用
void free(void*ptr)
在所有
lParam
s上,如果在应用程序被销毁之前丢弃了treeview,那么每次都会收到Darn scope的消息。谢谢,我来看看!该死的示波器每次都会让我抓狂。谢谢,我来看看!
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);