最近,想从 VB / VBA 环境转移到 VC++ 学习 MFC 编程。
决定先将在 VBA 中写的一段代码(实现批量打印Word文档功能)用 MFC 来实现,练练手先。
安装的是 VS2010 VC++,要用 MFC 操作 WORD 对象,开始考虑脱离Office程序,难度太大,先用从类型库向导中用“添加类”创建 IDispatch 包装类的办法吧。
通过在网上大量搜索,
先找到了 xiangjianbo127 的《VS2010操作Word建立工程》:
http://blog.youkuaiyun.com/xiangjianbo127/article/details/8610007
http://blog.youkuaiyun.com/xiangjianbo127/article/details/8610413
http://blog.youkuaiyun.com/xiangjianbo127/article/details/8610755
http://blog.youkuaiyun.com/xiangjianbo127/article/details/8610829
http://blog.youkuaiyun.com/xiangjianbo127/article/details/8610853
http://blog.youkuaiyun.com/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 ,再释放接口指针!这是不是问题所在?
调整顺序之后,正常执行……好轻松,特记于此!