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】