当前位置:软件学习 > Word >>

C++ 自动化操作Word

介绍:

这个事例演示了如何写C++代码来创建并操作一个Microsoft
Word实例,创建一个新文档,插入一个段落,保存文档,关闭Word程序并清理使用的COM资源。
利用VC++实现有三种基本方法:
1.使用#import指令和智能指针操作Word
Solution1.h/cpp中的代码演示了如何使用#import指令来实现操作Word。#import指令是一个Visual C++ 5.0后新支持的一个指令。从一个特定类型的库文件中创建VC++智能指针。它的功能非常强大,但是一般并不推荐,原因是在于微软办公应用程序一起使用时引用计数问题经常出现。与Solution2.h/cpp中直接利用API的方法不同,从类型信息中获益,智能指针可以让我们支持早或晚绑定到对象。#import指令帮我们处理了添加杂乱的guid到工程中。COM API同样包装在#import指令引入的类中。
2.利用MFC实现操作
使用MFC,使用Visual C++的类向导可以自动添加包装类。这些类使用了简单的COM服务。
3.利用C++和COM API来处理Word
 在Solution2.h/cpp中演示了如何使用C/C++和COM API自动操作Word。这种操作方法非常困难,但是有时确实必要的,因为你避免了使用MFC所带来的额外开销以及使用#import指令所带来的问题。你将利用像CoCreateInstance()这样的API以及类似IDispatch 和 IUnknown的COM接口。
 运行Sample
 步骤1.当你成功在VS2008中编译事例工程后,你会得到一个名称为CppAutomateWord.exe.的应用程序。

 步骤2.打开Windows资源管理器(Ctrl+Shift+Esc),确保没有winword.exe在运行。

 


 步骤3.运行程序,如果没有任何错误抛出的话,它应该打印下列内容。然后你就会看见在程序目录下生成两个新文档:Sample1.docx和Sample2.docx。每个文档都有如下内容

 


 步骤4.打开任务管理器确保没有winword.exe进程,并且Word实例正常退出清理。
 利用代码:
 A.使用#import指令和智能指针(Solution1.h/cpp)

 1.使用#import指令引入需要使用的包含COM服务的库文件


[csharp]
C# code snippet - 
 
#import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52" \  
        rename("RGB", "MSORGB") \ 
        rename("DocumentProperties", "MSODocumentProperties") 
    // [-or-]  
    //#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE12\\MSO.DLL" \  
    //    rename("RGB", "MSORGB") \  
    //    rename("DocumentProperties", "MSODocumentProperties")  
  
    using namespace Office; 
 
    #import "libid:0002E157-0000-0000-C000-000000000046"  
    // [-or-]  
    //#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"  
  
    using namespace VBIDE; 
 
    #import "libid:00020905-0000-0000-C000-000000000046" \  
        rename("ExitWindows", "WordExitWindows") \ 
        rename("FindText", "WordFindText") 
        // [-or-]  
    //#import "C:\\Program Files\\Microsoft Office\\Office12\\MSWORD.OLB" \  
    //    rename("ExitWindows", "WordExitWindows")  
    //    rename("FindText", "WordFindText")  
  
- end - 

C# code snippet -
 
#import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52" \
        rename("RGB", "MSORGB") \
        rename("DocumentProperties", "MSODocumentProperties")
    // [-or-]
    //#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE12\\MSO.DLL" \
    //    rename("RGB", "MSORGB") \
    //    rename("DocumentProperties", "MSODocumentProperties")
 
    using namespace Office;
 
    #import "libid:0002E157-0000-0000-C000-000000000046"
    // [-or-]
    //#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"
 
    using namespace VBIDE;
 
    #import "libid:00020905-0000-0000-C000-000000000046" \
        rename("ExitWindows", "WordExitWindows") \
        rename("FindText", "WordFindText")
        // [-or-]
    //#import "C:\\Program Files\\Microsoft Office\\Office12\\MSWORD.OLB" \
    //    rename("ExitWindows", "WordExitWindows")
    //    rename("FindText", "WordFindText")
 
- end -
 2.编译工程,如果成功,工程中会生成一个.tlh的文件,它包装了刚才引入的COM服务。它以一个包装类的形势供我们使用,我们可以通过它创建COM类并使用成员,方法等。
 3.在当前线程上初始化COM库。
 4.使用智能指针创建Word.Application COM对象。类的名字是原始接口名(例如Word::_Application)带一个Ptr前缀。我们可以利用智能指针的构造函数或是
 CreateInstance方法来创建一个COM对象。
 5.利用这个智能指针操作Word COM对象。例如你可以找到对Word的基本操作例如:
创建一个新的文档(例如Application.Documents.Add)
插入一个段落。
保存文档为docx文件并关闭它。
6.退出Word application(Application.Quit())
7.智能指针是自动释放的,所以我们不需要考虑收到释放COM对象。
8.我们有必要捕获可能的COM错误,例如
9.调用CoUninitialize销毁COM。
B.使用C++和COM API操作(Solution2.h/cpp)
1.添加自动化帮助类 AutoWrap.
2.初始化COM库,调用CoInitializeEx, 或 CoInitialize确保并发模型只有一个实例。
3.使用CLSIDFromProgID API获得Word COM的CLSID
4.使用CoCreateInstan获得IDispatch 接口
5.使用AutoWrap帮助类操作COM对象。
6.退出Word application(Application。Quit())
7.释放COM对象。
8.调用CoUninitialize卸载COM。
 

 Solution1.h


[cpp]
/****************************** Module Header ******************************\
* Module Name:  Solution1.h
* Project:      CppAutomateWord
* Copyright (c) Microsoft Corporation.

* The code in Solution1.h/cpp demonstrates the use of #import to automate 
* Word. #import (http://msdn.microsoft.com/en-us/library/8etzzkb6.aspx),
* a new directive that became available with Visual C++ 5.0, creates VC++ 
* "smart pointers" from a specified type library. It is very powerful, but 
* often not recommended because of reference-counting problems that typically 
* occur when used with the Microsoft Office applications. Unlike the direct 
* API approach in Solution2.h/cpp, smart pointers enable us to benefit from 
* the type info to early/late bind the object. #import takes care of adding 
* the messy guids to the project and the COM APIs are encapsulated in custom 
* classes that the #import directive generates.

* This source is subject to the Microsoft Public Lic

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,