Lparam不断变化TVITEM
LPARAM keeps changing in TVITEM
我正在将一堆项目添加到树视图中,并在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已重置为添加的最后一项的值。
因此,如果我添加具有类似lParam
值的项目one, two, three, four
,则在我检查它们都具有four
的lParam
之后。(有时,有垃圾值。)
这里显然有一个问题,这可能真的很容易解决,但是经过几个小时的实验,我找不到问题了。帮助!
tvi.lParam = (LPARAM) add0.c_str();
这是问题。 tvi.lParam
是指指针类型。
来自msdn:
lparam这种类型在windef.h中声明为:typedef long_ptr lparam;
什么是add0
?我想这是一个局部变量。如果函数返回,则该add0
var将被解构,并且tvi.lParam
指向字符串add0
的buff,现在释放了此buff,因此tvi.lParam
指向垃圾。
您在tvi.lParam
中存储一个地址。这是字符串add0
的地址。
如果 add0
不在范围内,则地址将变得无效。这就是您看到不同值的原因。
您必须分配tvi.lParam
始终可用的地址。使字符串成为全局变量或类成员变量。
再次,您需要每个树节点一个字符串。因此,您需要维护一系列字符串。如果您只有一个字符串,那么相同的地址将具有不同的值,就像您在一个,二,三,四。
的情况下观察到一样谢谢。
相关文章:
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 如何避免LED在循环状态变化中闪烁?
- 当 I2C 值在C++中发生变化时收到通知
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- 当我调用对象的方法时,对象的成员会发生变化
- 为什么向量内部的指针在从函数返回时会发生变化?
- 如何在 c++ 中循环中使用频率变化的声音?
- 为什么 C++ 中的零会发生变化
- 为什么我的全局变量似乎没有变化?
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- 为什么预减量会导致奇怪的变化?
- MATLAB:跟踪imufilter对象中的状态变化
- 当父小部件大小发生变化时,如何更改子小部件的大小?
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- C/C++ 检测双击 TVItem 的常用控件
- c++问题:给一个变量赋值后,另一个变量发生了变化
- Lparam不断变化TVITEM