程序出错comip.h指向if (m_pInterface != NULL){m_pInterface->Release();}
2014-12-14 22:48
501 查看
源程序如下:
分析:这类错误是在组件编程中非常普遍,主要原因是在组件编程中使用了智能指针造成的。
其中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();// 断开连接 ::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"); }运行正常!
相关文章推荐
- <c:if> 判断变量是否为null
- (g_jvm)->AttachCurrentThread(&env, NULL) 后使用 (g_jvm)->DetachCurrentThread();程序报错
- Argument for @NotNull parameter 'name' of com/android/tools/idea/welcome/Platform.<init> must not be
- 查找链表的中点if(fast!= NULL && fast->next != NULL) { //要用并运算,1->2中slow不能跳,所以要并运算fast->next != NULL
- CoUninitialize 退出时 m_pInterface->Release()崩溃 解决
- MFC程序中,只要加上#include <vector>,程序就报错(在其它位置),去掉这行没问题?不明白哪里出错了?
- tomcat6.0中<c:if>出错的问题
- 在Eclipse 的help->Install New SoftWare Add中https://dl-ssl.google.com/android/eclipse/ 出错解决
- 用Qt读取xml文件,程序执行到 if(!doc.setContent(&file)) 时候出错
- JavaScript escape/unescape编码的实现->>网页教学网Webjx.Com 提供最新最快的网页技术
- if(!order_address.equals("")&&order_address != null){
- <<展现C#>> 前言(补充) 和第三章 第一个C#程序(修订)
- &lt;展现C#&gt;前言(补充)和第三章第一个C#程序
- 解决spring+hibernate+struts2的java.lang.reflect.InvocationTargetException-->null异常
- 如何编写上传(PC->AS)和下载(AS->PC)程序示例
- MFC -> COM/ActiveX/more...
- ABAP--编写下载(AS->PC)并在客户端打开的程序示例
- Collection -> .Net集合类型大全,只要灵活运用可以节省很多开发时间和提高程序运行效率
- ABAP--编写下载(AS->PC)并在客户端打开的程序示例
- 到主机 的 TCP/IP 连接失败 (SQL2000数据库,使用的jar包是sqljdbc.jar->sql2005的包)