ATL编写的ActiveX控件作为OLE对象插入到Word文档中,持久化能力不好使

fly4free 2014-07-15 04:56:54
就是实现了 IPersistStream的Save等方法, 在里面保存几个DWORD值
再加载文档的时候Load方法里,读取值到变量里。

写是写进去了,我以zip文件的方式解压到当前文件夹,看到里面有activex文件夹,应该是写入了吧……

但是在读取的时候,所有的值都是0,IStream::Read 方法返回 S_OK 啊!!
这个控件插入到Excel文档里则工作正常,

还有一个现象,我使用代码向Word文档里Shapes集合里插入的OLEObject, 设置了控件的大小,保存后再打开,控件的大小貌似“恢复”了……
Office 2007

请教了!
...全文
278 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
myshinji 2014-07-17
  • 打赏
  • 举报
回复
楼主解决了吗,路过帮顶。
fly4free 2014-07-16
  • 打赏
  • 举报
回复
刚才我由换成了实现 IPersistStorage 接口, 在InitNew方法中创建了一个命名流, 在 Load, Save 中打开这个流,然后读写数据。 发现,打开docx文件,插入ole对象,保存这个过程都显得很正常。 可是关闭文档,再打开文档,Word调用该控件自己实现的 Load 方法时,返回 0x80030002,找不到 %1。 我哪些地方操作不对吗,以至于找不到我创建的流?或者必须调用哪些接口,才能够保存我创建的流?
fly4free 2014-07-16
  • 打赏
  • 举报
回复
! ! ! 现在有一个问题, 编程插入到Word的 ActiveX控件,就是Shape,不能保存创建时设置大小,保存关闭文档重新打开后,宽高变为了(144.0,144.0)。。明明关闭前还是那个设置好的大小呢…… 郁闷,有谁遇到这个问题吗?解决了分都给了!
fly4free 2014-07-16
  • 打赏
  • 举报
回复
经过了各种尝试,发现了,word在保存时,对我的控件进行了好几次,IPersistStorage::Save 调用,有几次 fSameAsLoad = FALSE。 貌似就是这几个 fSameAsLoad = FALSE 的,是真正最后存储的 IStorage 对象。。。。 这玩意儿,不试不知道啊。。。一个软件一个样啊,一会试试Excel啥样,哈哈。
fly4free 2014-07-16
  • 打赏
  • 举报
回复
引用 2 楼 aqtata 的回复:
我算是com新手,目前还在学习阶段。《com原理与应用》其中讲到了持久化。 我个人是这么想的,com在移动互联网的今天属于比较冷门小众的技术了,而且它本身就比较复杂,从应用的角度来说,有些东西没有必要深究,不是说一定非要去用它。 比如持久化,是不是可以用xml或protobuffer来解决呢? 我是新手,也许我对com本身的持久化理解有误,所以上面说的不一定正确哈。。
多谢关注,但是抱歉,你的回答与本帖主要问题在方向上,风马牛不相及啊,因为,现实情形是人家 Word 调用我的控件,不是我调用别人的接口。我要按照人家规定好的方式组织我的控件。。。
一如当初 2014-07-16
  • 打赏
  • 举报
回复
我算是com新手,目前还在学习阶段。《com原理与应用》其中讲到了持久化。 我个人是这么想的,com在移动互联网的今天属于比较冷门小众的技术了,而且它本身就比较复杂,从应用的角度来说,有些东西没有必要深究,不是说一定非要去用它。 比如持久化,是不是可以用xml或protobuffer来解决呢? 我是新手,也许我对com本身的持久化理解有误,所以上面说的不一定正确哈。。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧