设为首页 加入收藏

TOP

12.2.1 VC++实现Office自动化
2013-10-07 00:16:14 来源: 作者: 【 】 浏览:64
Tags:12.2.1 实现 Office 自动化

12.2  MS Office 中的COM应用

MS Office中的COM是应用最广泛的自动化技术,该功能所描述的是利用Visual C++(www.cppentry.com)应用程序控制Microsoft Office组件。自动化(OLE自动化)技术允许将现有的程序的功能合并到VC++(www.cppentry.com)的应用程序中。自动化技术建立在组件对象模型(COM)的基础上,系统的COM随操作系统一起安装的动态链接库(DLL)提供一组服务。例如,应用程序中使用Microsoft Word的拼写和语法检查功能,而不让用户看到Microsoft Word:可以使用Office的OCR技术,自动化也可以使用Microsoft Excel的所有图表、打印和数据分析工具等。该技术的特点大大简化了开发过程,加快了开发的进度。

12.2.1  VC++(www.cppentry.com)实现Office自动化

1.问题阐述

熟悉VBA的开发者对于这一操作都非常熟悉,在VC++(www.cppentry.com)中读取MS Word系统并没有显示的这一功能,但是在Microsoft 的 Office 产品中,都提供了OLE Automation 自动化程序的接口,在VC++(www.cppentry.com)中如何实现Office的自动化技术呢?

2.实现技巧

VC++(www.cppentry.com)实现Office自动化,通常可以采取以下3种方式实现。

1)利用Visual C++(www.cppentry.com)的类向导机制,从Office类型库生成包装类

生成的这些类,以及诸如 COleVariant、COleSafeArray 和 COleException 之类的其他 MFC类可简化自动化任务,操作更加简单,所以建议采用该方法。

2)通过#import指令引入Office类型库,创建智能指针的方式

智能指针的功能非常强大,但不建议使用它,因为它与 Microsoft Office 应用程序一起使用时,经常会出现引用计数问题。

3)利用C++(www.cppentry.com)直接调用COM服务

C++(www.cppentry.com)相比上面两种方式实现起来比较困难,但是有时为了避免采用MFC造成的资源开销过大或避免使用#import方式所带来的问题,通常采用此种方式。

类型库与C/C++(www.cppentry.com)头文件类似,它包含服务器发布的接口、方法和属性。Visual C++(www.cppentry.com)附带的OLE/COM对象查看器(Oleview.exe)用来查看类型库。表12-1列出了Microsoft Office 95、Microsoft Office 97、Microsoft Office 2000、Microsoft Office 2002和Microsoft Office 2003的类型库文件名。

表12-1  Office类型库

Office版本和类型< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

类型库文件

Office版本和类型

类型库文件

Access 97

Msacc8.olb

PowerPoint 2000

Msppt9.olb

Jet Database

3.5 DAO350.dll

Word 2000

Msword9.olb

Binder 97

Msbdr8.olb

Access 2002

Msacc.olb

Excel 97

Excel8.olb

Excel 2002

Excel.exe

Graph 97

Graph8.olb

Graph 2002

Graph.exe

Office 97

Mso97.dll

Office 2002

MSO.dll

Outlook 97

Msoutl97.olb

Outlook 2002

MSOutl.olb

PowerPoint 97

Msppt8.olb

PowerPoint 2002

MSPpt.olb

Word 97

Msword8.olb

Word 2002

MSWord.olb

Access 2000

Msacc9.olb

Office Access 2003

Msacc.olb

Jet Database 3.51

DAO360.dll

Office Excel 2003

Excel.exe

Binder 2000

Msbdr9.olb

Graph 2003

Graph.exe

Excel 2000

Excel9.olb

Office 2003

MSO.dll

Graph 2000

Graph9.olb

Office Outlook 2003

MSOutl.olb

Office 2000

Mso9.dll

Office PowerPoint 2003

MSPpt.olb

Outlook 2000

Msoutl9.olb

Office Word 2003

MSWord.olb

MFC引入类型库的一般步骤如下。

(1)启动MFC的ClassWizard,出现如图12-19所示的对话框。

 
(点击查看大图)图12-19  添加类型库向导1
(2)在Office的目录中找到适合版本的类型库,如图12-20所示。
 
图12-20  添加类型库向导2
(3)选择类型文件后,根据所实现的功能选择不同的类,当然,也可以全部选择,如图12-21所示。
 
图12-21  添加类型库向导3
(4)单击【OK】按钮,将所选择的类_Application添加到创建应用程序中,如图12-22所示。
 
图12-22  添加类型库向导4
在MS Word中,_Application的一个对象代表是Word应用程序本身,在VC++(www.cppentry.com)中通过自动化技术控制Word时,则可用_Application声名一个类对象,通过CreateDispatch实例化该对象,代码参考如下:
 _Application  wordApp;
wordApp.CreateDispatch(_T(Word.Applcation));

实例化对象后,应用程序就启动了应用程序,通过对象实例wordApp可以获得Word版本属性、修改Word标题等,可以参考_Application 方法和属性。

3.实例代码

本实例演示了利用VC++(www.cppentry.com)创建的应用程序打开Word,并且获取Word的版本号,关闭Word文档。

(1)创建一个基于对话框的工程AutoMation,在窗口上放置一个进度条和两个按钮,用于启动和关闭Word。启动VC++(www.cppentry.com)的ClassWizard,添加MS Word的类型库(MSWord.olb),选择要生成的类_Application。添加后,在源文件文件夹中增加了msword.h和msword.cpp两个文件。

(2)在CAutoMationApp的InitInstance中添加初始化COM的代码:

HRESULT hr = AfxOleInit();
if(FAILED(hr))
{
AfxMessageBox("初始化COM失败!!");
}

(3)为了处理VARIANT类型方便,在stdafx.h中包含头文件atlbase.h。

(4)添加按钮的处理消息和定时器处理代码。

打开按钮的响应代码:

void CAutoMationDlg::OnOpenBtn() 
{
if(!m_App.CreateDispatch(CLSID_Application))  //可以采用CLSID启动
{
 AfxMessageBox(_T("请检查是否安装了Office"));
return;
}
if(!m_App.CreateDispatch(_T("Word.Application"))) //启动Word
{
 AfxMessageBox(_T("请检查是否安装了Office"));
return;
}
else
{
SetTimer(1,500,NULL);
 MessageBox("Word启动");
 MessageBox(m_App.GetVersion());    //获取Word版本
m_App.SetCaption("this is a test");     //设置Word的标题
m_nCurStep = 0;
m_ProgressCtrl.SetStep(10);
m_ProgressCtrl.SetRange(0,40);
m_App.SetVisible(TRUE);

}
关闭按钮的响应代码:
/************************************************************************/
/* 关闭Word
/************************************************************************/
void CAutoMationDlg::OnCloseBtn()
{
//定义调用QUIT时使用的参数
VARIANT VarIsSave,VarInit,VarRoute; 
//退出Word时候的不保存参数
VarIsSave.vt=VT_BOOL; 
VarIsSave.boolVal=VARIANT_FALSE;

//初始化VARIANT变量
::VariantInit(&VarInit);  
::VariantInit(&VarRoute);     
//VarRoute.vt=VT_EMPTY;
//VarInit.vt = VT_EMPTY;
    //调用Quit,退出Word应用程序
m_App.Quit(&VarIsSave,&VarInit,&VarRoute);
MessageBox("退出Word编辑!");
m_ProgressCtrl.SetPos(0);
//释放对象指针
m_App.ReleaseDispatch();  //一定要释放
}
定时器处理代码:
void CAutoMationDlg::OnTimer(UINT nIDEvent) 
{
m_nCurStep+=10;
m_ProgressCtrl.SetPos(m_nCurStep);
int n = m_ProgressCtrl.GetPos();
if(n > 40)
{
KillTimer(1);
}
CDialog::OnTimer(nIDEvent);
}
运行效果如图12-23所示。
 
图12-23  VC++(www.cppentry.com)启动Word
【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇12.1.6 使用C++API创建COM对象 下一篇12.1.9 创建一个自动化组件的技巧

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: