十分不解,为何CList在第二次以后遍历时值就变了...(急问)

Stefine 2007-04-21 10:10:52
大致代码是这样的:
简要的说明下代码吧:

//用来存储手机名片姓名与号码
struct CONTACTPARTINFO
{
int nID;
BSTR strName;
BSTR strTelMobile;
};

类中声明:
CList<CONTACTPARTINFO, CONTACTPARTINFO &> m_lstPartContact;

//********************************************************************
//函数功能: 读取号簿信息(仅号码与姓名)保存到m_lstPartContact链表中
//********************************************************************
bool CContact::GetPartContact(void)
{
//得到pContact指针的部分省略...

m_lstPartContact.RemoveAll();

CONTACTPARTINFO contactPartInfo;

contactPartInfo.nID = i-1;

pContact->get_FirstName( &contactPartInfo.strName); pContact->get_MobileTelephoneNumber( &contactPartInfo.strTelMobile);

m_lstPartContact.AddTail(contactPartInfo);

}


//********************************************************************
// 函数功能: 显示号簿全部信息
// 参数: strContact为传出的参数,代表部分号簿内容
//********************************************************************
void CContact::ShowPart(CString& strContact)
{
POSITION pos = m_lstPartContact.GetHeadPosition();
while(pos)
{
strContact += m_lstPartContact.GetAt(pos).strName ;
strContact += m_lstPartContact.GetAt(pos).strTelMobile;

m_lstPartContact.GetNext( pos );
}
AfxMessageBox( strContact );
}

问题症状:
假如我输入两条名片信息 (名字,号码): (1,2) ,(3,4)
第一次打印出来是1234
第二次打印出来就是3434

后面假设你再添加两条名片 (5,6) (7,8)
打印出来就是34343434

我调试时,发现在CContact::GetPartContact(void) 中总是能正确获取到值啊,也就是加入前面四条时,m_lstPartContact 依次为(1,2) (3,4) (5,6) (7,8)啊,为何显示出来就变了咧?

问题出在遍历时吗? 急问?谢谢

规律:
连续输入四条:
第一次是12345678
第二次以后就是78787878
...全文
229 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjh824 2007-04-21
  • 打赏
  • 举报
回复
会不会是BSTR释放的问题?
Stefine 2007-04-21
  • 打赏
  • 举报
回复
//********************************************************************
// 函数功能: 读取号簿信息(仅号码与姓名)保存到m_lstPartContact链表中
//********************************************************************
bool CContact::GetPartContact(void)
{
//m_lstPartContact.RemoveAll();

IFolder *pCurrFldr = NULL;
IPOutlookItemCollection *pItemCol = NULL;

if (GetPoomFolder(olFolderContacts, &pCurrFldr))
{
if (SUCCEEDED(pCurrFldr->get_Items(&pItemCol)))
{
IContact * pContact = NULL;
int cItems = 0;

pItemCol->get_Count(&cItems);
for (int i = 1; i <=cItems; i++)
{
if (SUCCEEDED(pItemCol->Item (i, reinterpret_cast<IDispatch**>(&pContact))))
{
//获取号簿信息
CONTACTPARTINFO contactPartInfo;

contactPartInfo.nID = i-1;

pContact->get_FirstName( &contactPartInfo.strName); //名字
pContact->get_MobileTelephoneNumber( &contactPartInfo.strTelMobile);//移动电话

m_lstPartContact.AddTail(contactPartInfo);

// clean up
SysFreeString(contactPartInfo.strName);
SysFreeString(contactPartInfo.strTelMobile);


pContact->Release();
}
}
return true;
}
}
else
{
return false;
}

return true;
}

是循环读取所有记录的.//所以要RemoveAll
Stefine 2007-04-21
  • 打赏
  • 举报
回复
我是当一调用这函数,就去读取整个电话本中的所有记录...( 调试时发现所有记录都能正确得到)

所以就先RemoveAll了咯? 不然的会就重复累加到后面了

不是这的问题,不过也谢谢

在线急等...
Estfania 2007-04-21
  • 打赏
  • 举报
回复
m_lstPartContact.RemoveAll();
GetPartContact()好像是一个一个加进去的,不知道为什么要RemoveAll
Stefine 2007-04-21
  • 打赏
  • 举报
回复
纠正下: 输入两条记录(1,2) ,(3,4)时,前面两次都是1234,第三次后就是3434了
但输入超过三条记录时 打印的都是最后一条记录内容
如(1,2) ,(3,4) (5,6) 第二次及以后565656
(1,2) (3,4) (5,6) (7,8) 第二次及以后78787878

可以肯定的是名片内容已正确存入手机电话本里的,我去读取时每次都RemoveAll了,再把电话本记录全读出来的啊,调试到这里时发现的确是全部读取到了,不管你第几次去读取...

为何显示时却成这样了咧?

菜鸟虚心请教...
Stefine 2007-04-21
  • 打赏
  • 举报
回复
搞定,谢谢LS提醒

确实是bstr没释放?

哎..基本不札实...学习ing

接分

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧