我的程序是用ListView显示FTP当前目录下的所有文件,可以连接成功后,只能得到最后一个文件名(多次显示,当前几个文件,就显示几次),其他的看不到了,请问问大家这是怎么回事,如何解决。主要的函数我给出来了。void CLevodiskView::OnInitialUpdate()
{
CListView::OnInitialUpdate(); m_ilLarge.Create(IDB_LARGEDOC, 32, 1, RGB(255, 0, 255));
m_ilSmall.Create(IDB_SMALLDOC, 16, 1, RGB(255, 0, 255)); GetListCtrl().SetImageList(&m_ilLarge, LVSIL_NORMAL);
GetListCtrl().SetImageList(&m_ilSmall, LVSIL_SMALL); GetListCtrl().InsertColumn(0, _T("名称"), LVCFMT_LEFT, 192);
GetListCtrl().InsertColumn(1, _T("大小"), LVCFMT_RIGHT, 96);
GetListCtrl().InsertColumn(2, _T("上传日期"), LVCFMT_CENTER, 128); Refresh();
        ^^^^^^^^^^^见下
}int CLevodiskView::Refresh()
{
m_pInetSession = new CInternetSession(_T("strAppName"), 1, PRE_CONFIG_INTERNET_ACCESS);
CFtpConnection *m_pFtpConnection = m_pInetSession->GetFtpConnection(m_strServer, m_strUserName, m_strPassword, m_bPassive);
m_pFtpConnection->SetCurrentDirectory(m_strCurDir);
int nCount = 0; CFtpFileFind finder(m_pFtpConnection); BOOL bContinue = finder.FindFile(_T("*.*")); if (!bContinue) return 0; GetListCtrl().DeleteAllItems(); ITEMINFO *pItem = new ITEMINFO;
LV_ITEM lvi; while (finder.FindNextFile()) {
memset(&lvi, 0, sizeof(LVITEM));
pItem->strFileName = finder.GetFileName();
pItem->nFileSizeLow = finder.GetLength();
finder.GetCreationTime(&pItem->ftLastWriteTime);

lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
lvi.iItem = nCount;
lvi.iSubItem = 0;
lvi.iImage = 0;
lvi.pszText = LPSTR_TEXTCALLBACK;
lvi.lParam = (LPARAM) pItem;
//AfxMessageBox(_T(pItem->strFileName));//去掉此行,只能看到视图中显示最后一个目录多次,
如果打开此行,可以看到视图的每一行都是正确的,只是程序执行完后又变成同一个文件名多个了。
if (GetListCtrl().InsertItem(&lvi) == -1)
return 0;
} finder.Close();
return nCount;
}

解决方案 »

  1.   

    ITEMINFO *pItem = new ITEMINFO;//放到while循环里面去。注意,不要delete。响应LVN_DELETEALLITEMS(大概)消息的时候再把每个lParam释放。
    因为你只分配了一次内存,所以只存在着一个ITEMINFO的实例,每次while循环都是改变了同一个ITEMINFO的内容,所以最后每个Item的lParam实际上指向了同一个内存地址。
    另外估计你没有释放内存的操作,因此造成了内存泄漏;否则,执行可能出错。