VC中通过自动化客户端操作Word2000

2024-04-26 16:58

本文主要是介绍VC中通过自动化客户端操作Word2000,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们在编写程序,开发软件的过程中如果能利用已有的程序的功能,那么可以大大减轻开发过程中程序员的工作量,同时达到事半功倍的效果。例如在工程中,许多软件需要文字处理功能,虽然MFC提供了一些方法,但是具体实现起来既费事,又有一定的困难,如果我们可以直接使用OFFICE提供的功能,岂不美哉!要实现这一目的,只需要利用微软的ActiveX Automation技术就可以轻松实现。本例主要讲述了自动化的概念,并通过一个操作Word文档的程序来帮助读者朋友理解Visual C++编程中如何实现自动化。

   一、实现方法

  1.自动化的概念

  在Windows程序开发中,自动化是基于COM/DCOM之上的技术:它可以使一个应用程序来操纵另外一个程序中的对象,使用该程序提供的丰富的功能;或者是一个应用程序通过提供一些对象及对象的方法和属性来允许另外一个程序使用它提供的各种功能。其中,根据程序是受惠者还是施惠者这一原则,将提供对象和对象属性方法的应用程序称为自动化服务器端;使用对象属性方法的应用程序叫作自动化的客户端。自动化服务器让其它程序告诉它做些什么,它揭示的函数和数据称为方法(Methods)和属性(Properties)。例如Microsoft Office套件中的成员Word、Excel等都是自动化服务器。根据自动化的客户端和服务器端的不同位置,又可以将自动化分为两类:

  1)如果作为服务器端和客户端的两个不同的应用程序都在同一台计算机上,叫作本地自动化;

  2)如果作为服务器端和客户端的两个不同的应用程序是基于网络的,分别处于不同的计算机上,叫作远程自动化。

  需要读者朋友注意的是,由于利用了COM技术,客户端无法直接获得服务器端的对象来实现对它的访问,它必须通过获取一个指向接口的指针来使用对象提供的功能。这个接口称为IDispatch,它是一个简化的使用多种不同语言的特殊接口(包括象Visual Basic这样不能使用指针的语言)。这部分内容读者可以在下面的程序实现过程中细细体味。

  说到自动化,不能不提一下ActiveX控件,它其实是在进程中装入的极小自动化服务器。这意味着它们的执行速度极快,它们原来被称为OLE自定义控件,用来替代VB和Visual C++中使用的16位的VBX控件。由于ActiveX控件通常被保存为.OCX文件,所以又称它为OCX控件。因为控件是一个小型化的自动化服务器,它们需要在自动化客户端使用,我们又将这时的客户端应用程序称为容器应用程序。ActiveX控件除了属性和方法外,还包含事件(events),当一些事情需要容器应用程序注意时,控件才会触发一个事件,如用户的单击等。

  2.自动化中的数据类型

  在实现自动化编程中,最重要的一个问题是程序员要明白在自动化的客户端和服务器端数据是如何传递的。如何提供一个统一安全的机制来实现数据传递呢?在Visual C++开发平台上,它提供了一个叫VARIANT的数据类型来解决这个问题。该数据类型有两部分组成,第一部分为数据的类型,第二部分才是具体的数据的数值。在VARIANT数据类型的基础上,VC提供了ColeVariant类,它对VARIANT数据类型进行了封装,这意味着在所有使用VARIANT的地方都可以使用ColeVariant类的对象。在操作日期和货币变量时,Visual C++又提供了两个类:ColeCurrency和ColeDateTime,具体的内容,读者可以参考MSDN。

  本实例的代码演示了如何操作Word2000实现自动化,由于我们主要是为了辅助解释说明Visual C++编程中怎样实现自动化,帮助读者对自动化的实现过程有一个感性的认识,所以为了简单起见,该程序的功能是仅仅选择一个Word2000的*.Doc文档,并将它的内容都在该程序的"视"中显示出来。为了达到这个目的,就需要启动Word2000打开用户所选择的文件,进行全选和剪贴板操作,然后将数据粘贴到"视"中。

  在这个例子的具体实现中,我们的应用程序为自动化的客户端,Word2000为自动化的服务器端。首先生成一个新的单文档应用程序,视的基类选择CEditView,由于Office中的许多操作是由VBA语言来实现的,所以我们在使用自动化操作Word2000的过程中,为了清楚Word2000的工作过程,我们要对VBA有所了解,这些知识可以通过在Word中录制宏来实现。录制宏的步骤如下:启动Word2000,选择工具菜单下的录制宏子菜单,为一个新的宏起个名字为Macro1,开始录制宏,这时候窗口出现一个浮动工具条,点击上面的按钮可以停止或暂停宏的录制。下面是实现打开一个Word2000文档、全部选择文档内容并将数据存放到剪贴板上的操作的宏代码:

' Sub Macro1()
'' 宏在 02-5-1 由 LiuTao 录制
'
Documents.Open FileName:="基于Visual C.doc", ConfirmConversions:=False, _
ReadOnly:=False, AddToRecentFiles:=False, PasswordDocument:="", _
PasswordTemplate:="", Revert:=False, WritePasswordDocument:="", _
WritePasswordTemplate:="", Format:=wdOpenFormatAuto
Selection.WholeStory
Selection.Copy
End Sub

  查看宏代码可以点击Word2000中工具菜单下的Visual Basic 编辑器。从上面的代码中可以看出对Word2000的这几个操作用到了Documents、Selection这两个自动化服务器端显示出来的对象和它们的方法。

  为了在Visual C++中编程操作Word2000,需要使用微软提供的类型库,这个类型库可以在Msword9.olb文件中找到,Msword9.olb这个文件通常情况下位于Microsoft Office的安装目录下面。利用Visual C++中的Class Wizard可以方便的向应用程序添加新的类型库,在应用程序的项目代码中启动Class Wizard ,选择Add class…. /From a type library …/C:/OFFICE/msword 9.olb,在弹出的对话框中选择_Application,_Documents,Selection,这样就可以为客户端程序中使用到的每个Word2000对象建立相应的C++类。这些类的定义和实现分别在msword9.h和msword9.cpp文件中给出。

  为了使生成程序的项目代码支持自动化,我们需要要在项目中的StdAfx.h的文件末尾添加上下面一行:#include "afxdisp.h";在应用程序的InitInstance函数的开始添加下面的调用:

if (CoInitialize(NULL)!=0)
{
 AfxMessageBox("初始化COM支持库失败!");
 exit(1);
}


  在操作Word2000的过程中,首先通过ColeDispatchDriver类的成员函数CreateDispatch()创建一个Word2000的Applicaion对象,然后通过COleDispatchDriver的成员函数AttachDispatch()将Documents和Selection对象与Application对象提供的IDispatch接口关联起来,在程序对上述对象使用完毕后,要使用COleDispatchDriver的成员函数ReleaseDispatch()来释放对象和接口之间的连接。

  二、编程步骤

  1、 启动Visual C++6.0,生成一个单文档的应用程序,视图的基类选择CEditView类,将该程序命名为"OperateWord";

  2、 启动Word2000,根据所要执行的Word操作录制宏;

  3、 使用Class Wizard为应用程序的项目代码中添加操作Word2000的类型库Msword9.olb;

  4、 添加代码,编译运行程序。


  三、程序代码


void COperateWordView::OnShowDoc()
{
 // TODO: Add your command handler code here
 static char BASED_CODE szFilter[]="Word Files(*doc)|*.DOC||";
 CFileDialog fd(true,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter,NULL);
 CString strFilePath;//用来保存打开的文件名;
 if(fd.DoModal()==IDOK)
  strFilePath=fd.GetPathName();//获取要打开的Word文档的名字;
  _Application m_App;//定义Word提供的应用程序对象;
 Documents m_Docs;//定义Word提供的文档对象;
 Selection m_Sel;//定义Word提供的选择对象;
 m_Docs.ReleaseDispatch();
 m_Sel.ReleaseDispatch();
 m_App.m_bAutoRelease=true;
 if(!m_App.CreateDispatch("Word.Application"))
 {
  AfxMessageBox("创建Word2000服务失败!");
  exit(1);
 }
 //下面是定义VARIANT变量;
 COleVariant varFilePath(strFilePath);
 COleVariant varstrNull("");
 COleVariant varZero((short)0);
 COleVariant varTrue(short(1),VT_BOOL);
 COleVariant varFalse(short(0),VT_BOOL);
 m_Docs.AttachDispatch(m_App.GetDocuments());
 //将Documents类对象m_Docs和Idispatch接口关联起来;
 m_Docs.Open(varFilePath,varFalse,varFalse,varFalse,
  varstrNull,varstrNull,varFalse,varstrNull,
  varstrNull,varTrue,varTrue,varTrue);
 //打开Word文档;
 m_Sel.AttachDispatch(m_App.GetSelection());
 //将Selection类对象m_Sel和Idispatch接口关联起来;
 m_Sel.WholeStory ();//选择文档中的全部内容;
 m_Sel.Copy();//将数据拷贝到剪贴板
 this->GetEditCtrl( ).Paste ();//将数据粘贴到程序的"视"中;
 m_Docs.ReleaseDispatch();//断开关联;
 m_Sel.ReleaseDispatch();
}


  四、小结

  本实例主要讲述了基于自动化的技术如何操作Word2000,为读者学习自动化客户端程序的开发起到抛砖引玉的作用,读者可以在此基础上,实现对Word2000、Excel2000、PowerPoint2000等服务器端进行更复杂的操作。最后补充一句,如果读者朋友想操作OFFICE98版本的应用程序,只需要引入微软提供的8.0版本的类型库就可以了。

这篇关于VC中通过自动化客户端操作Word2000的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/938140

相关文章

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要