程序出错comip.h指向if (m_pInterface != NULL){m_pInterface->Release();}

源程序如下:

//将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");
}
运行正常!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值