搜狐首页 - 新闻 - 体育 - 娱乐 - 财经 - IT - 汽车 - 房产 - 女人 - 短信 - 彩信 - 校友录 - 邮件 - 搜索 - BBS - 搜狗 
搜狐首页 >> IT频道 >> 数码天下 >> 网狐教程-搜狐IT >> 程序开发-网狐教程-搜狐IT >> C语言
在MFC应用程序中动态嵌入Word文档
IT.SOHU.COM  2004-08-09 18:29  转自: 天极网
页面功能 【我来说两句】【我要“揪”错】【推荐】【字体: 】【打印】 【关闭

科博会惊艳发明看花眼(组图)
微软抛出更多长角代码
卓越向左走 当当向右走
IT评论:掘墓人Skype 探寻魔鬼海域龙三角(图)
男婴体内活寄生胎



  本文通过对自动化等COM技术的应用介绍了一种在MFC应用程序中动态嵌入Microsoft Word文档的简单方法。使在MFC应用程序中即可打开、显示和存储外部Word文档。

  关键字:VC++、MFC、COM、自动化

引言

  Microsoft Office办公套件以其功能强大、方便实用而被广泛使用。其中的Word软件更是作为最流行的文字处理软件而使Word格式文档成为事实上的文件交换标准之一。出于对当前Word格式文档文件流行程度的现实考虑,如果自己开发的字处理软件(或类似功能的软件)不支持Word格式文档那几乎是不可想象的,这样的软件也必然会由于不能处理占相当比例的Word文档文件而不被用户所认同。所以,在此类软件开发时,添加对Word格式文档文件的支持是必不可少的。本文将就此话题展开讨论。

  添加类型库到工程

  在应用程序中添加对Word支持的方法有很多,但无非以下两大类:一类是自己编写代码或借助第三方提供的程序开发包实现对Word的支持;另一类方法是直接在程序中对Word提供的各种外部功能接口进行调用而同样达到支持Word的目的。前一种方法工作量相对较大,而且无论是在功能上还是在可靠性方面都很难达到与Word一样的水准。后一类方法实际是采取某种技术途径而将支持Word文档的功能转交给Word软件去完成,这样的处理显然能够达到与Word一样的对Word文档文件的支持水平。这一类方法主要借助DDE或COM等技术途径实现,本文将通过COM中的自动化技术借助Word提供的各种外部功能接口实现对Word文档的支持。采用这种方式可以尽可能少的占用自动化客户的资源,并且不需要被访问对象的类型信息就可以进行调用。

  下面给出具体实施过程。字处理软件通常采取单文档或多文档程序结构,为了使用Word提供的COM 组件,建立的应用程序需要是包容器,因此在用AppWizard创建一个新的MFC AppWizard(EXE)工程时选择单文档视图(SDI)或多文档视图(MDI)结构,并在第3步选中Container,以提供容器支持。 其它可采取默认选项。在ClassView中将产生如下类:

  应用类: CEmbed_WordApp in Embed_Word.h and Embed_Word.cpp

  框架类: CMainFrame in MainFrm.h and MainFrm.cpp

  文档类: CEmbed_WordDoc in Embed_WordDoc.h and Embed_WordDoc.cpp

  视图类: CEmbed_WordView in Embed_WordView.h and Embed_WordView.cpp

  容器类: CEmbed_WordCntrItem in CntrItem.h and CntrItem.cpp

  接下来添加Word类型库到工程。在View菜单中选择ClassWizard子菜单,从弹出对话框的Automation选项卡中点击Add Class按钮,选择From a TypeLibrary并在Office目录中选中Microsoft Word 97/2000 类型库Word8.olb或Word9.olb,这将把类型库中的所有类添加到你的工程中。这时,ClassView中会多出几十个类,可以通过这些类提供的接口来实现对Word文档的支持。

  为了获取标准COM接口IDispach,可在CCntrItem类中添加返回数据类型为LPDISPATCH 的GetIDispatch()函数,该函数通过QueryInterface()方法对IID_Idispatch接口的查询而返回得到指向IDispach接口的指针:

ASSERT_VALID(this);
ASSERT(m_lpObject != NULL);
LPUNKNOWN lpUnk = m_lpObject;
Run();
LPOLELINK lpOleLink = NULL;
if(m_lpObject->QueryInterface(IID_IOleLink,(LPVOID FAR*)&lpOleLink)== NOERROR)
{
 ASSERT(lpOleLink != NULL);
 lpUnk = NULL;
 if(lpOleLink->GetBoundSource(&lpUnk) != NOERROR)
 {
  TRACE0("Warning: Link is not connected!\n");
  lpOleLink->Release();
 }
 ASSERT(lpUnk != NULL);
}
LPDISPATCH lpDispatch = NULL;
if(lpUnk->QueryInterface(IID_IDispatch,(LPVOID FAR*)&lpDispatch) != NOERROR)
{
 TRACE0("Waring: does not support IDispatch!\n");
 return NULL;
}
ASSERT(lpDispatch != NULL);
return lpDispatch;

  为了使用类型库中的方法,需要在使用类型库的地方添加对“MSWord8.h”的引用(如使用Word 2000,则包含对“MSWord9.h”的引用)。

[1] [2] [3下一页 
页面功能 【我来说两句】【我要“揪”错】【推荐】【字体: 】【打印】 【关闭




ChinaRen - 搜狐招聘 - 网站登录 - 帮助中心 - 设置首页 - 广告服务 - 联系方式 - 保护隐私权 - About SOHU - 公司介绍
Copyright © 2005 Sohu.com Inc. All rights reserved. 搜狐公司 版权所有

相关链接
  • 在MFC应用程序中动态嵌入Word文档(08/09 18:30)
  • 在MFC应用程序中动态嵌入Word文档(08/09 18:30)
  • 《市场报》:联想MFC能撼动复印机市场吗?(12/02 08:11)

  •  ■ 我来说两句
    用  户:        匿名发出:
    请各位遵纪守法并注意语言文明。
     
    *经营许可证编号:京ICP00000008号
    *《互联网电子公告服务管理规定》
    *《全国人大常委会关于维护互联网安全的规定》
    短信内容:
    手 机
    自写包月5分钱/条 更多>>
    搜狐天气为你抢先报! 魔力占卜姻缘一线牵!
    金币不是赚的是抢的! 爱情玄机任由你游戏!
    猪八戒这样泡到紫霞! 帅哥一定要看的宝典!
    你受哪颗星星的庇护? 萨达姆最新关押照片!
    精彩彩信
    [和弦]欧若拉 一生有你
    沧海一声笑
    [音效]挪威的森林
    爆铃 MP3 G点图 动画
    [和弦]童话 你到底爱谁
    [原唱]一千年以后 断点
    [爆笑音效]赚钱拉 野花
    [串烧]张韶涵 潘玮柏
    精彩短信
    [和弦]小薇 好心分手
    [音效]当当当当 忘记


    搜狐商城
    ·家电|品牌风扇新品热销
    ·音乐|秦海璐幸福回味
    ·图书|《眼镜蛇事件》
    更多...