【问题标题】:LPARAM keeps changing in TVITEMLPARAM 在 TVITEM 中不断变化
【发布时间】:2012-10-29 10:38:17
【问题描述】:

我将一堆项目添加到树视图中,字符串存储在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,那么在我检查它们之后,它们都有 lParamfour。 (有时会有垃圾值。)

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

【问题讨论】:

    标签: c++ winapi pointers treeview lparam


    【解决方案1】:

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

    来自 MSDN:

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

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

    【讨论】:

    • 你说得对,它是本地的。感谢您的提示 - 有关修复它的任何建议?
    • 请同时检查 txt0: tvi.pszText = const_cast (txt0.c_str()); // 显示文本
    • 我正要问这个问题,但我没有注意到任何奇怪的行为。这也是一个指针,对吧?
    • tvi.lParam = (LPARAM)_strdup(add0.c_str()),这将分配内存并复制字符串。请记住在使用完树视图后调用释放 tvi.lParam
    • 谢谢,这行得通!只是为了确认一下,您的意思是在所有lParams 上调用void free ( void * ptr );,如果树视图在应用程序被销毁之前被丢弃?
    【解决方案2】:

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

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

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

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

    谢谢。

    【讨论】:

    • 该死的范围每次都能吸引我。谢谢,我去看看!
    猜你喜欢
    • 1970-01-01
    • 2016-03-21
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2020-12-15
    相关资源
    最近更新 更多