我做了一个抓包程序,用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"然后结束。
请高手帮我解决一下这个问题,弄了好几天了还是不行,求求各位了,谢谢!!!!!!!
这是存储数据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"然后结束。
请高手帮我解决一下这个问题,弄了好几天了还是不行,求求各位了,谢谢!!!!!!!
byte* data=(byte *) m_list.GetItemData(pLV->iItem);
if (data == NULL) return; ...
}
不过有这样一个问题,如果我把存储数据的代码改成这样
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)中