总是在 COleDispatchDriver::ReleaseDispatch() 内部 m_lpDispatch = NULL; 处触发异常

来源:互联网 发布:影楼调色软件 编辑:程序博客网 时间:2024/06/05 03:06

最近,想从 VB /  VBA 环境转移到 VC++  学习 MFC 编程。

决定先将在 VBA  中写的一段代码(实现批量打印Word文档功能)用 MFC 来实现,练练手先。

安装的是 VS2010 VC++,要用 MFC 操作 WORD 对象,开始考虑脱离Office程序,难度太大,先用从类型库向导中用“添加类”创建 IDispatch 包装类的办法吧。

通过在网上大量搜索,

先找到了 xiangjianbo127 的《VS2010操作Word建立工程》:

http://blog.csdn.net/xiangjianbo127/article/details/8610007
http://blog.csdn.net/xiangjianbo127/article/details/8610413
http://blog.csdn.net/xiangjianbo127/article/details/8610755
http://blog.csdn.net/xiangjianbo127/article/details/8610829
http://blog.csdn.net/xiangjianbo127/article/details/8610853
http://blog.csdn.net/xiangjianbo127/article/details/8610858

后来找到了博客园http://www.cnblogs.com上 小鱼儿C 的《c++封装Word (比较全了)》:

http://www.cnblogs.com/c-study/archive/2012/01/04/2311772.html

参照他们的代码,写出了我需要的MFCWord类,最近三个晚上的调试把我折磨得够惨!不断反复触发异常:

“Duprint.exe 中的 0x769dc6b4 处有未经处理的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突

编译器绿色箭头停在 void COleDispatchDriver::ReleaseDispatch() 函数中 m_lpDispatch = NULL; 语句上,大意可能是指针已经释放,所以出错。整个网络世界搜索,也没有好的解决办法。对 COM 初始化语句和 m_Doc.ReleaseDispatch(); m_Docs.ReleaseDispatch(); m_App.ReleaseDispatch(); 语句进行各种各样可能的调整都无济于事。

还好,今晚(实际上当时已算成昨天了!)又查看了杨老师《COM 组件设计与应用(十一)IDispatch 及双接口的调用》中的示例代码,发现了一点端倪:

pDisp->Release();        // 释放接口指针
::CoUninitialize();     // 释放 COM

释放接口指针,再释放 COM !

而前面, xiangjianbo127 和 小鱼儿C 的代码是释放 COM ,再释放接口指针!这是不是问题所在?

调整顺序之后,正常执行……好轻松,特记于此!

0 0
原创粉丝点击