办公自动化使用 Visual c + +

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

本页

概要

本文回答有关 Microsoft office 自动化,从 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 自动化) 是功能的一种技术,它允许您利用现有程序,并将其合并到您自己的应用程序。例如,您可以利用 Word 拼写和语法检查到您的应用程序没有对您的用户可见的 Microsoft Word 的功能。您甚至可以使用所有的 Microsoft Excel 图表功能、 打印,和数据分析工具。此技术可以极大地简化和加快您的开发速度。
  2. 我是的自动化,在哪里可以找到很好的资源,以了解更多的新? 韩建 Kruglinski"内部 Visual c + +"一章 24 (ISBN:1-57231-565-2) 提供的一般概述,以及一些好的示例。此外,Microsoft 知识库是信息的一个很好来源。本文本身是一个不错的起点,并在下面 Microsoft 知识库中相应的文章中找到更特定的引用:
    152023定位要研究 OLE 自动化资源
    如果愿意按示例学习,请参阅 Microsoft 知识库中下面的文章:
    179706HOWTO 使用 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 和 COM 接口 IDispatch 和 IUnknown 等。
    值得注意有自动化与普通的 C 相比,因为 COM 围绕 c + + 类设计的 c + + 之间的一些稍微有些差异。有关详细的信息,请参阅以下有关 C 的示例在 Microsoft 知识库文章:
    181473HOWTO: 使用从 C 应用程序的 OLE 自动化
  4. COM 是什么?

    自动化基于组件对象模型 (COM)。COM 是一个标准软件的体系结构基于接口,和设计上具有分隔到独立 (自包含) 的对象的代码。将它视为对单独的应用程序扩展,面向对象编程 (OOP) 范例的但适用。每个对象公开一组接口,并初始化、 通知,和数据传输的对象的所有通信都会通过这些接口。

    COM 也是一组与操作系统一起安装的动态链接库 (dll) 所提供的服务。自动使用这些服务的很多。例如,如果"Marshalling"为服务包对服务器应用程序的接口的成员函数的客户端应用程序的调用,并将那些与它们的服务器应用程序的参数传递。它使其显示服务器的接口将公开在不是这样,当客户端在其自己的进程空间中运行.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 寻找一个特定的文档附加到它,然后从其获取应用程序对象。在下面的 Microsoft 知识库文章,为迭代 ROT 和寻找文档名称中没有的某些代码:
    190985HOWTO: 从一个 OCX 获取 IDispatch Excel 或 Word 文档的
    您不需要执行此操作对于 PowerPoint,因为它是一个单实例应用程序 ; 您只可以运行它的一个实例。
  6. 我如何进行传递可选参数?

    某些方法具有"可选"参数。在 Visual Basic 中您可以随便省略这些调用方法时。但是,使用 Visual c + + 调用时必须传递一个特殊的 VARIANT.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 使您逐步骤示例:
    183599HOWTO: 捕获使用 VC + + 的 Microsoft Word97 应用程序事件
    一般情况下,设置通知连接,您获得服务器的 IConnectionPointContainer 以及调用 FindConnectionPoint() 与事件接口的 IID。这使您可以 IConnectionPoint 接口和所有剩下的是调用 Advise() 与事件接口的实例。将然后通过该接口回调用服务器,这些事件发生时。
  8. 我自动化代码是速度太慢。如何能我事情加快速度?

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

    这些值被称为 hresult,并在 winerror.h 中定义。数字是太大,因为第一位表示无论是一个错误的结果。您可以使用随 Visual c + + 将这些数字转换为有意义的说明提供 ErrLook.Exe 实用程序。

    如果您希望以编程方式获取的错误说明,您可以使用 FormatMessage() API。有关 FormatMessage() 的使用,请参阅下面的 Microsoft 知识库文章,有关详细信息和示例:
    186063信息: 平移的 VB/VBA 的自动化错误
    122957示例: Decode32 和 Decode16 OLE 错误编码解码器工具
    : 如果使用的 Visual c + + 6.0 中,并已包含在调试监视窗口中的该值的变量附加",hr"(不带引号) 对其已将其翻译为您的 Visual c + +!
  10. 类型库是什么?

    类型库是类似于 C/c + + 头文件。它包含接口、 方法,和发布服务器的属性。您可以查看与该 OLE/COM 对象查看器 (Oleview.exe) 与 Visual c + + 的类型库。下面是 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 对象模型进行从版本 97 到 95 重大更改。Excel 95 的 IDispatch 的单个实现中实现它的所有方法和属性。这意味着通常您可以将用于对象 X,Y 对象中的方法。这不是一个良好的设计,以便在 Office 97 中每个对象都有其自己单独的 Idispatch 实现。这意味着如果寻求方法或属性从一个单独的对象 Y 中的对象 X 获得错误 0x80020003,-2147352573,"找不到成员"。若要不必此错误,您需要确保您正在进行呼叫,从基础 IDispatch 接口是语义上正确。下面的 Microsoft 知识库文章有关的详细信息,请参阅:
    172108HOWTO: 疑难解答"成员找不到",0x80020003 错误
  2. 我的程序完成后,我正在自动化在应用程序保持在内存中。在发生什么情况?

    最有可能,这是因为您忘记了释放已获得的接口,并且您将需要向下跟踪它。下面是一些一般性建议,并查找事项:

    • 如果您正在使用 # import,则很可能您可以为一个与之关联的引用计数错误运行。通常 bug 可处理,周围,但通常它首选使用其他自动化方法之一。# import 不会使用 Office 应用程序很好地工作,因为其类型库和使用都是相当复杂。此外,此类的引用计数问题很难跟踪,因为使用 # import 时,很多接口级别 COM 调用是后台。
    • 如果要调用返回一个 IDispatch 的任何方法,打开,或新建,如检查 * (LPDISPATCH) 并忽略返回值。是否您然后将放弃此返回的接口并需要将更改您的代码,以便它不再需要时释放。
    • 逐渐注释掉部分代码直到问题消失,然后将其添加回谨慎跟踪问题的起始位置。
    • 请注意某些应用程序将保持运行,如果用户具有"接触"应用程序。如果发生这种情况时将自动执行,然后在应用程序将可能保持以后运行。Office 应用程序具有在应用程序对象,您可以读/写若要更改此行为上的"用户控件"属性。
    • 此外,某些应用程序将决定保持运行,如果发生了足够的用户界面"操作"。如果您退出该应用程序,然后在应用程序对象上调用其 Quit() 方法。调用退出时,Word 将关闭,而不考虑其引用计数。这不是预期的 COM 行为。Excel,但是,将正确地只是隐藏本身但仍保持运行,直到未完成的所有接口都被都释放。一般情况下,应解除所有未完成的引用,并只调用 Quit(),如果您想要退出应用程序。
  3. 我知道我要给 Office 的应用程序用户如何进行这以编程方式通过自动处理,但?

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

    绝对。这一轮获取 IDispatch 指针: 这在 Visual c + + 技术说明 39 (TN039) 中给出。请参阅下面的 Microsoft 知识库文章的逐步骤示例:
    184663HOWTO: 嵌入和自动化 MFC 使用 Microsoft Excel 工作表
  5. 如何访问我的文档属性 Office 文档中?

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

属性

文章编号: 196776 - 最后修改: 2008年3月13日 - 修订: 7.0
这篇文章中的信息适用于:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Project 2000 标准版
  • Microsoft Excel 2000 标准版
  • Microsoft Visual C++ 4.0 标准版
  • Microsoft Visual C++ 5.0 企业版
  • Microsoft Visual C++ 6.0 企业版
  • Microsoft Visual C++ 5.0 专业版
  • Microsoft Visual C++ 6.0 专业版
  • Microsoft Visual C++, 32-bit Learning Edition 6.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 标准版
关键字:?
kbmt kbsweptvs2008 kbautomation kbfaq KB196776 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 196776
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈