源程序如下:
//将jmail.dll直接拷贝到工程中可用#import "jmail.dll"或者使用绝对路径,如下
#import "E:\\SRC\\jmail.dll"
void main()
{
CoInitialize(NULL);
jmail::IPOP3Ptr pPOP3("JMail.POP3");
pPOP3->Timeout = 60;//非必须,设置超时为60秒,默认为120秒
// 连接服务器,邮箱、密码、服务器、端口
pPOP3->Connect("uutkuu@163.com","123456","pop3.163.com",110);
jmail::IMessagesPtr pMessages;
jmail::IMessagePtr pMessage;
pMessages = pPOP3->Messages;
// 获取邮件数目(因为第0个ITEM是未用的,所以减1)
long lCount = pMessages->Count - 1;
for(long i = 1; i <= lCount; i++)// 遍历每封信
{
pMessage = pMessages->Item[i];
bstr_t bstrSubject = pMessage->Subject;
_bstr_t bstrFrom = pMessage->From;
_bstr_t bstrBody = pMessage->Body;
printf("(%d)Subject:%s, From:%s, Body:%s\r\n",i,(const char*)bstrSubject,(const char*)bstrFrom,(const char*)bstrBody);
pMessage.Release();
}
pMessages->Clear();// 这里的Clear并不是清除邮件服务器上的邮件
pMessages.Release();
pPOP3->Disconnect();// 断开连接
::CoUninitialize();
system("pause");
}
出错:
分析:这类错误是在组件编程中非常普遍,主要原因是在组件编程中使用了智能指针造成的。
其中jmail为邮件开发组件,jmail::IPOP3Ptr为智能指针。
组件编程要求所有组件的操作都要在CoInitialize()和CoUninitialize()函数中完成。
智能指针的特性是在离开其生存范围后,能够自动的调用释放内存的函数Release()。
在以上的代码中jmail::IPOP3Ptr在整个main函数中有效,所以其在main函数结束后,会调用Release函数释放内存。
但此时CoInitialize()与CoUninitialize()执行完了,不应该再使用组件内容。而jmail::IPOP3Ptr会在main结束后,会调用Release函数,它属于组件编程范畴,所以会出错。
解决方法:将jmail::IPOP3Ptr放在一个小的作用域内,保证在执行CoUninitialize()之前释放内存。
//将jmail.dll直接拷贝到工程中可用#import "jmail.dll"或者使用绝对路径,如下
#import "E:\\SRC\\jmail.dll"
void main()
{
CoInitialize(NULL);
{//小的作用域
jmail::IPOP3Ptr pPOP3("JMail.POP3");
pPOP3->Timeout = 60;//非必须,设置超时为60秒,默认为120秒
// 连接服务器,邮箱、密码、服务器、端口
pPOP3->Connect("uutkuu@163.com","123456","pop3.163.com",110);
jmail::IMessagesPtr pMessages;
jmail::IMessagePtr pMessage;
pMessages = pPOP3->Messages;
// 获取邮件数目(因为第0个ITEM是未用的,所以减1)
long lCount = pMessages->Count - 1;
for(long i = 1; i <= lCount; i++)// 遍历每封信
{
pMessage = pMessages->Item[i];
bstr_t bstrSubject = pMessage->Subject;
_bstr_t bstrFrom = pMessage->From;
_bstr_t bstrBody = pMessage->Body;
printf("(%d)Subject:%s, From:%s, Body:%s\r\n",i,(const char*)bstrSubject,(const char*)bstrFrom,(const char*)bstrBody);
pMessage.Release();
}
pMessages->Clear();// 这里的Clear并不是清除邮件服务器上的邮件
pMessages.Release();
pPOP3->Disconnect();// 断开连接
}//pPOP3在离开此作用域后会进行内存释放
::CoUninitialize();
system("pause");
}
运行正常!