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);