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 |
|
| 图12-20 添加类型库向导2 |
|
| 图12-21 添加类型库向导3 |
|
| 图12-22 添加类型库向导4 |
_Application wordApp; |
实例化对象后,应用程序就启动了应用程序,通过对象实例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(); |
(3)为了处理VARIANT类型方便,在stdafx.h中包含头文件atlbase.h。
(4)添加按钮的处理消息和定时器处理代码。
打开按钮的响应代码:
void CAutoMationDlg::OnOpenBtn() |
/************************************************************************/ //调用Quit,退出Word应用程序 |
void CAutoMationDlg::OnTimer(UINT nIDEvent) |
|
| 图12-23 VC++(www.cppentry.com)启动Word |
| 回书目 上一节 下一节 |




