我做了一个抓包程序,用CListCtrl将数据包的基本信息显示出来后,想把所有的数据(data)存放在CListCtrl中然后通过双击某一项后将这一项中存储的数据再取出来,显示在别的窗口中。我的部分代码是这样编的。
           这是存储数据data的代码..........
           int i=pDlg->m_list.GetItemCount();
  char buf[100];
  memset(buf,0,sizeof(buf));
  sprintf(buf,"%d",i);
  pDlg->m_list.SetItemText(lvi.iItem,0,buf);
  byte *data=new byte[header->len];
  memcpy(data,pkt_data,header->len);
  pDlg->m_list.SetItemData(i,(DWORD)data);
这是进行双击某一项进行取数据并显示的代码
          void CSnifferDlg::OnDataTranslate(NMHDR* pNMHDR, LRESULT* pResult)
{ m_tree.DeleteAllItems();
UpdateData(FALSE);
int index=m_list.GetNextItem(-1, LVNI_SELECTED);
// int index=m_list.GetSelectedCount();
if(index<0)
return;
byte*  data=(byte *)m_list.GetItemData(index);
TVINSERTSTRUCT tvInsert;
tvInsert.hParent=NULL;
tvInsert.item.mask=TVIF_TEXT;
m_tree.SetTextColor(RGB(254,0,254));    
tvInsert.item.pszText=_T("数据包");
HTREEITEM hParent=m_tree.InsertItem(&tvInsert);
hParent=m_tree.InsertItem(_T("ETHERNET包"),hParent,TVI_LAST);
char buffer[256];
memset(buffer,0,sizeof(buffer));
eth_header * eh=(eth_header *)data;
sprintf(buffer,"源MAC地址:%02X-%02X-%02X-%02X-%02X-%02X",eh->src_mac[0],eh->src_mac[1],
eh->src_mac[2],eh->src_mac[3],eh->src_mac[4],eh->src_mac[5]);
m_tree.InsertItem(_T(buffer),hParent,TVI_LAST);
在运行时没有错误,可是一双击 CListCtrl的某一项时就显示某一段内存不能为"read"然后结束。
请高手帮我解决一下这个问题,弄了好几天了还是不行,求求各位了,谢谢!!!!!!!

解决方案 »

  1.   

    NMLISTVIEW * pLV = reinterpret_cast<NMLISTVIEW *>( pNMHDR );if (pLV->iItem >= 0) {
      byte*  data=(byte *) m_list.GetItemData(pLV->iItem);
      if (data == NULL) return;    ...
    }
      

  2.   

    header->len是否大于sizeof(eth_header)?
      

  3.   

    我的这个header->len就是eth->header
    不过有这样一个问题,如果我把存储数据的代码改成这样
    for(int i=0;i<pDlg->m_list.GetItemCount();i++)
    {
      byte * data= new byte[header->len];
      memcpy(data,pkt_data,header->len);
      pDlg->m_list.SetItemData(i,(DWORD)data);
    }
    就不出现程序停止,内存不可读的问题,但是我双击的项目和取出来的数据对不上。
    对了,我用的是Winpcap编程,上面的这段代码在回雕函数
    void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)中