0

我正在使用虚拟照明控件,并从地图中获取数据。我的问题是当我运行代码时,它显示列表正常,但是当鼠标光标移动到列表控件上或当我尝试向下滚动时,它给出了一个调试断言失败,说 map/set 迭代器不可取消引用。我的 GetDispInfo() 方法如下:

void CListCtrlTestDlg::GetDispInfo(NMHDR* pNMHDR, LRESULT* pResult) 
{
   LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
   LV_ITEM* pItem = &(pDispInfo)->item;

   map<int, Error_Struct>::iterator it  = Error_Map.find((pItem->iItem) + 1);
   int iErrCode = (*it).second.i_ErrorCode;
   CString cError = (*it).second.c_Error;


    switch(pItem->iSubItem)
    {
    case 0:
        sprintf_s(pItem->pszText, 10, "[ %d ]", iErrCode);
        break;
    case 1:
        sprintf_s(pItem->pszText, 100, "%s", cError);
        break;
    }


*pResult = 0;

}

此外,如果当鼠标指针位于列表控件的顶部时,程序会再次崩溃,并从 output.c 文件中显示的行中显示访问冲突:

#else  /* _UNICODE */
   if (_putc_nolock(ch, f) == EOF)

有没有人有同样的经历?我在这里做错了什么,我该如何解决这个问题?

谢谢你!

4

2 回答 2

1

对于初学者,你怎么知道你传递给 sprintf_s 的魔法常数 10 和 100 实际上是 pItem->pszText 中正确的空间量?您应该使用 pItem->cchText。

其次,您可能应该检查从 std::map::find 返回的迭代器是否有效。

于 2010-07-22T06:49:08.697 回答
0

实际问题是我试图将数据复制到 LV_ITEM 结构的非缓冲区成员。我试图将数据复制到一个指针,这就是问题所在。我真正应该做的是在不复制数据的情况下为该指针分配一个值。

p = o_RBTree.FindByPosition((pItem->iItem) + 1);

char zKey[10];
zKey[0] = '\0';
sprintf_s(zKey, 10, "%d", p.first);

char zVal[100];
zVal[0] = '\0';
sprintf_s(zVal, 100, "%d", p.second);

if (pItem->mask && LVIF_TEXT) 
{
    switch(pItem->iSubItem)
    {
    case 0:
        pItem->pszText = zKey;
        break;
    case 1:
        pItem->pszText = zVal;
        break;
    }
}

这完美!谢谢您的帮助。

于 2010-07-23T04:03:43.373 回答