使用 Visual C++ office 自动化

文章翻译 文章翻译
文章编号: 196776 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文回答与自动化到 MicrosoftOffice 有关从 Visual C++ 的常见问题。

更多信息

目录

  1. 自动化功能有哪些?
  2. 我第一次接触自动化,在哪里可以找到很好的资源,以了解更多?
  3. 是否有不同的方式,我可以使用自动化吗?
  4. COM 功能有哪些?
  5. 如何附加到正在运行的 Office 应用程序实例?
  6. 如何将可选参数传递?
  7. 如何捕获 Office 应用程序所公开的事件?
  8. 我的自动化代码速度太慢。如何提高速度事情?
  9. 这些巨大的错误值,如-2147352573 或 0x80030002,意味着什么?
  10. 类型库是什么?
  11. 与 Microsoft Excel 95 中,但无法正常工作,Microsoft Excel 97 家我自动化代码。为什么?
  12. 为什么不会我自动执行的应用程序驻留在内存后完成我的程序?
  13. 我知道我想作为 Microsoft Office 应用程序用户,请执行,但如何做到这以编程方式使用自动化?
  14. 可以自动执行嵌入的 Microsoft Office 应用程序吗?
  15. 如何访问我在 Microsoft Office 文档的文档属性?

问题和解答

  1. 自动化功能有哪些?

    自动化 (以前称为 OLE 自动化) 是功能的一种技术,允许您利用现有程序并将其合并到您自己的应用程序。例如,您可以利用 Microsoft Word 拼写和语法检查功能,为您的应用程序,而无需对用户可见的 Microsoft Word。您甚至可以使用所有的 Microsoft Excel 图表、 打印和数据分析工具。这项技术可以大大简化并加快您的开发。
  2. 我第一次接触自动化,在哪里可以找到很好的资源,以了解更多?第 24 章的 David Kruglinski"内 Visual C++"(ISBN:1-57231-为 565-2) 提供的一般概述,以及一些很好的例子。另外,Microsoft 知识库文章中是信息的一个很好来源。这篇文章本身是一个不错的起点,并可以找到更具体参考下面 Microsoft 知识库中相应的文章:
    152023 查找资源来研究 OLE 自动化
    如果愿意学习的示例,请参阅下面 Microsoft 知识库中相应的文章:
    179706 如何使用 MFC,若要使 Excel 自动运行 & 创建/格式化一个新工作簿
  3. 是否有不同的方式,我可以使用自动化吗?

    您可以使用自动化的三种基本方法: MFC,#import 和 C/c + +:

    • 使用 MFC,使用 Visual C++ 类向导从 Microsoft Office 类型库生成"包装类"。这些类,以及其他 MFC 类,如 COleVariant、 COleSafeArray、 COleException,简化自动化的任务。而不是其他,通常建议使用此方法,大多数的 Microsoft 知识库文章中的示例使用 MFC。
    • #import,与 Visual C++ 5.0,可供使用了一个新指令创建 VC + +"智能指针"从指定的类型库。由于引用的盘点通常遇到的问题与 Microsoft Office 应用程序一起使用时是功能非常强大,但通常不建议这样做。
    • C/c + + 自动化是这么多困难,但有时需要避免使用 MFC,开销或 #import 的问题。基本上,使用 CoCreateInstance(),作为此类 Api,例如 IDispatch 和 IUnknown 接口的 COM。
    值得注意的是有一些细微的差异与普通的 C 中,因为 COM 围绕 c + + 类设计的 c + + 中的自动化。有关详细信息,请参阅下面的 C 例如在 Microsoft 知识库文章:
    181473 如何: 使用 C 应用程序中的 OLE 自动化
  4. COM 功能有哪些?

    自动化基于组件对象模型 (COM) 上。COM 是一种标准的软件结构基于接口,并用于提供代码分离为独立的对象。把它作为扩展的面向对象编程 (OOP) 范例中,但是它也适用不同的应用程序。每个对象都公开一组接口,并为一个对象如初始化、 通知和数据传输的所有通信都是通过这些接口。

    COM 也是一套与操作系统一起安装的动态链接库 (Dll) 所提供的服务。自动使用这些服务的很多。一个例子是"封送处理"服务,打包到服务器应用程序的接口的成员函数的客户端应用程序的调用,并将那些与它们的服务器应用程序的参数传递。它使其显示在客户端的内存空间,不是这样,当客户端在其各自的进程空间中运行的.exe 暴露服务器的接口。封送处理还获取返回值从服务器的方法重新跨进程边界而安全地将手中的客户端的调用。有许多其他服务不可或缺的各种 COM 库提供的自动化。有关它们的信息来源包括"内 Ole-第二版"的 Kraig Brockschmidt、 ISBN 1-55615-843-2、"内 COM"Dale Rogerson-ISBN 1-57231-349-8,"自动化程序员参考,"通过 ISBN 1-57231-584-9。
  5. 如何附加到正在运行的 Office 应用程序实例?

    使用 GetActiveObject() API。在自动化服务器中注册 ROT (运行对象表),通过 RegisterActiveObject() API。自动化客户端可以在代码正在运行的实例中获取,如:
          // Translate server ProgID into a CLSID. ClsidFromProgID
          // gets this information from the registry.
          CLSID clsid;
          CLSIDFromProgID(L"Excel.Application", &clsid);  
    
          // Get an interface to the running instance, if any..
          IUnknown *pUnk;
          HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
    
          ASSERT(!FAILED(hr));
    
          // Get IDispatch interface for Automation...
          IDispatch *pDisp;
          hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);
          ASSERT(!FAILED(hr));
    
          // Release the no-longer-needed IUnknown...
          pUnk->Release();
    
    						
    请注意: 如果有多个实例运行您要附加的 Office 应用程序,您将只能附着在使用 GetActiveObject() API 启动的第一个实例。

    从理论上讲,可以循环访问 ROT 中为每个单独的实例,但如果因为自己的名字对象始终是相同的 (它无法区分吗),另一个实例已经在 ROT 中的 Office 应用程序没有注册自己。这意味着您不能将附加到除第一个之外的任何实例。但是,因为 Office 应用程序还可以在 ROT 中注册他们的文档,则可以成功附加到其他实例进行迭代 ROT 寻找特定的文档中,将连接到它,然后从它中获取应用程序对象。循环访问 ROT 和查找文档名称下面的 Microsoft 知识库文章中还有一些代码:
    190985 如何: 从 OCX 获取 Excel 或 Word 文档的 IDispatch
    您不需要执行此操作的 PowerPoint,因为它是单实例应用程序 ;您只能运行它的一个实例。
  6. 如何将可选参数传递?

    某些方法具有参数的"可选"。在 Visual Basic 中,可以随意忽略它们调用该方法时。但是,当使用 Visual C++ 调用必须传递一个特殊的变量,该变量.vt 域的值的 VT_ERROR,和.scode 字段是 DISP_E_PARAMNOTFOUND。这就是:
          // VARIANT used in place of optional-parameters.
          VARIANT varOpt;
          varOpt.vt = VT_ERROR;
          varOpt.scode = DISP_E_PARAMNOTFOUND;
    						
    这实际上是做什么 Visual Basic 幕后。
  7. 如何捕获 Office 应用程序所公开的事件?

    基本上您实现该事件接口,您想要捕获 ("接收器"),并设置通知连接的应用程序 ("来源")。以下文章提供分步示例为 Microsoft Word:
    183599 如何: 捕捉使用 VC + + Microsoft Word97 应用程序事件
    一般情况下,要设置通知连接,您获取服务器的 IConnectionPointContainer,调用 FindConnectionPoint() 的事件接口的 IID。这样,您的 IConnectionPoint 接口,剩下的是调用您的事件接口的实例的 Advise()。将然后通过此接口回拨的服务器,这些事件发生时。
  8. 我的自动化代码速度太慢。如何提高速度事情?

    自动化的速度问题的一个常见原因是与重复的读取和写入的数据。这是典型的 Excel 自动化客户端。但是,大多数人不会意识到通常被写入或读取一次同时使用 SAFEARRAY 此数据。请参阅下面的 Microsoft 知识库文章有关信息和提供信息的示例:
    186120 如何: 使用 MFC 使 Excel 自动运行并填充数组包含一个范围
    186122 如何: 使用 MFC 使 Excel 自动运行 & 范围中获取一个数组
    179706 如何: 使用 MFC 使 Excel 自动运行并创建/格式化一个新工作簿
    此外,值得指出的是使用剪贴板有时可以提高性能。例如,可以将数据复制到剪贴板中,然后使用自动化告诉服务器来粘贴。或进行相反的转换。告诉服务器复制到剪贴板并粘贴到您的应用程序。
  9. 这些巨大的错误值,如-2147352573 或 0x80030002 的意思是什么?

    这些值称为 hresult 映射,并在 winerror.h 中定义。这些数字很大,因为第一位代表是一个错误的结果。您可以使用 ErrLook.Exe 实用程序所带 Visual C++,以将这些数字翻译成有意义的说明。

    如果您希望以编程方式获取错误的说明,您可以使用 FormatMessage() API。FormatMessage() 的使用,请参阅有关详细信息和示例下面的 Microsoft 知识库文章:
    186063 信息: 翻译为 VB/VBA 的自动化错误
    122957 示例: Decode32 和 Decode16 OLE 错误代码解码器工具
    请注意: 如果您使用的 Visual C++ 6.0 和具有包含该调试的监视窗口中的值的变量,将追加",人力资源部"(不带引号) 到它能够将其转换为您的 Visual C++!
  10. 类型库是什么?

    类型库是类似于 C/c + + 头文件。它包含接口、 方法和属性的服务器发布。您可以查看具有带有 Visual C++ OLE/COM 对象查看器 (Oleview.exe) 的类型库。下面是一组 Microsoft Office 95、 97 和 2000年类型库文件名:
    
           Office Application      | Type library
           ------------------------+----------------
           Word 95 and prior       | wb70en32.tlb
           Excel 95 and prior      | xl5en32.olb
           Powerpoint 95 and prior | Powerpoint.tlb
           Access 95 and prior     | msaccess.tlb
           Binder 95               | binder.tlb
           Schedule+               | sp7en32.olb
           Project                 | pj4en32.olb
           Team Manager            | mstmgr1.olb
           Word 97                 | msword8.olb
           Excel 97                | excel8.olb
           Powerpoint 97           | msppt8.olb
           Access 97               | msacc8.olb
           Binder 97               | msbdr8.olb
           Graph 97                | graph8.olb
           Outlook 97              | msoutl8.olb
           Outlook 98              | msoutl85.olb
           Word 2000               | msword9.olb
           Excel 2000              | excel9.olb
           Powerpoint 2000         | msppt9.olb
           Access 2000             | msacc9.olb
           Outlook 2000            | msoutl9.olb
           Word 2002               | msword.olb
           Excel 2002              | excel.exe
           Powerpoint 2002         | msppt.olb
           Access 2002             | msacc.olb
           Outlook 2002            | msoutl.olb 
    
    
    						
  1. 与 Excel 95 中,但无法正常工作,与 Excel 97 家我自动化代码。发生了什么?

    Excel 的对象模型进行 95 至 97 版本的重要更改。Excel 95 一个 IDispatch 的实现中实现的所有方法和属性。这就意味着通常无法调用用于对象 X、 Y 对象中的方法。这不是一个好的设计,以便在 Office 97 中,每个对象都有其自己单独的 Idispatch 实现。这意味着如果您请求的方法或从对象 X 与 Y 的单独对象的属性时,出现错误 0x80020003,-2147352573,"找不到成员"。若要避免此错误,您需要确保您打电话从基础 IDispatch 接口是语义正确。请参阅以下 Microsoft 知识库文章详细信息:
    172108 如何: 解决"成员找不到",0x80020003 错误
  2. 我的程序完毕后,我自动执行的应用程序保持在内存中。发生了什么?

    很可能,这是因为忘记了释放已获得的接口,而您需要跟踪它。下面是一些一般性建议,并将查找到的东西:

    • 如果您使用的 #import,则很可能您无法运行到一个与之关联的引用计数错误。通常 timesthe bug 可以变通,但通常首选使用自动化的其他方法之一。#import 不能非常 wellwith Office 应用程序,因为其类型库和 useare 相当复杂。此外,这种引用计数问题是 hardto 跟踪由于大量接口级别的 COM 调用 arebehind 场景时使用 #import。
    • 检查以查看调用任何方法,例如保持打开状态,或新建,它们返回 IDispatch * (LPDISPATCH),并且忽略 returnvalue。如果是,则正在放弃它返回 interfaceand 将需要更改代码,以便在不再需要时,会释放它。
    • 逐渐注释掉的代码节,直到 problemdisappears,然后将其添加回谨慎追踪 theproblem 开始的位置。
    • 请注意某些应用程序将保持运行,如果用户具有"接触"应用程序。如果出现这种情况时将自动执行,然后该应用程序可能仍以后运行。TheOffice 应用程序具有一个"用户控件"属性 Applicationobject,您可以以读/写来更改此行为。
    • 此外,某些应用程序会决定保持运行如果发生 enoughuser 接口的"操作"。如果您打算应用程序中断退出,然后调用其 Quit() 方法 Applicationobject。Word 将关闭,而不考虑其引用计数 whenQuit 调用。这不是预期的 COM 行为。Excel 中,将正确地只是隐藏自身但是,保持运行,直到所有的 outstandinginterfaces 都被释放。一般情况下,应释放 alloutstanding 的引用,并只能调用 Quit(),如果想要应用程序退出。
  3. 我知道我要不要作为 Office 应用程序用户,但如何做到这以编程方式通过自动化?

    您所感兴趣的是什么对象、 方法和属性,您需要使用。若要了解如何导航的对象模型的 Word、 Excel 和 Powerpoint,根据您要执行操作的用户,最好的方法是使用宏录制器。只需从工具菜单中选择录制新宏 Macro\、 执行的任务,您感兴趣,然后选择 Macro\ 停止录制。完成练习后录制时,从工具菜单中选择 Macro\Macros,选择您所记录的宏,然后单击编辑。这将为生成的 VBA 代码,将完成您所记录的任务。请记住所录制的宏不会最可能的代码在大多数情况下,但它不会很好地快速的示例。
  4. 可以自动执行嵌入的 Office 应用程序吗?

    绝对。这一目的获取 IDispatch 指针: 这 Visual C++ 技术注 39 (TN039) 中给出。请参阅下面的 Microsoft 知识库文章有关的分步示例:
    184663 如何: 嵌入并自动化使用 MFC 的 Microsoft Excel 工作表中
  5. 如何访问我的 Office 文档中的文档属性?

    文档属性是通过自动化,或者直接通过 IPropertyStorage 进行访问的。下面的 Microsoft 知识库文章说明每一种方法:
    179494 如何: 使用自动化来检索内置文档属性
    186898 如何: 读取直接使用 VC + + 的复合文档属性

属性

文章编号: 196776 - 最后修改: 2013年9月29日 - 修订: 9.0
这篇文章中的信息适用于:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Project 2000 标准版
  • Microsoft Excel 2000 标准版
  • Microsoft Visual C++ 5.0 企业版
  • Microsoft Visual C++ 5.0 专业版
  • Microsoft Access 97 标准版
  • Microsoft Excel 97 标准版
  • Microsoft PowerPoint 97 标准版
  • Microsoft Outlook 97 标准版
  • Microsoft Word 97 标准版
  • Microsoft Access 2000 标准版
  • Microsoft PowerPoint 2000 标准版
  • Microsoft Outlook 2000 标准版
  • Microsoft Word 2000 标准版
  • Microsoft Access 2002 标准版
  • Microsoft Excel 2002 标准版
  • Microsoft PowerPoint 2002 标准版
  • Microsoft Word 2002 标准版
  • Microsoft Outlook 2002 标准版
关键字:?
kbsweptvs2008 kbautomation kbmt KB196776 KbMtzh
机器翻译
重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。
点击这里察看该文章的英文版: 196776
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com