[IT168 技术文档]摘要: 本文主要针对企业中使用Office 自动化来构建利用Office 产品内置的功能和特性的自定义解决方案所产生的一些复杂情况,提供实际可行的解决方案。
开发人员可以使用Office 自动化来完成利用Office 产品内置的功能和特性的自定义解决方案。 但是,由于这种使用方式并不是Microsoft所推荐以及支持的,如果要通过服务器端代码(例如,Active Server Pages (ASP)、DCOM 或 NT Service)进行“自动化”,就会发生一些不可预知的情况。
本文主要针对开发人员可能会面对的这些复杂情况,提供可以提高性能的“自动化”备选方案,并提出在必须要进行服务器端“自动化”的情况下配置 Office 的方法。
1. 使用服务器端 Office 自动化时出现的问题
在使用服务器端Office 自动化解决方案的时候应当了解到Office的表现会因为环境的不同而表现出主要的五大问题。要成功运行您的代码,就需要解决这些问题,而且需要尽可能减少它们的影响。在构建自己的应用程序时,要仔细考虑这几个问题,因为没有任何一种解决方案能全部解决所有这些问题,不同的设计要求您优先考虑不同的元素。
1. 用户身份:Office 应用程序在由“自动化”启动运行时会假定存在一个用户身份。它们根据用户注册表配置单元中的设置为启动应用程序的用户初始化工具栏、菜单、选项、打印机和一些加载项。许多服务会在没有用户配置文件的帐户下运行,因此,Office 可能无法在启动时进行正确的初始化,进而返回一个有关“CreateObject”或“CoCreateInstance”的错误。即使能够在没有用户配置文件的情况下启动 Office 应用程序,其他功能也可能无法正常工作。
2. 与桌面的交互性:Office 应用程序假定它们在某个交互式桌面下运行,在有些情况下,可能需要让用户看到它们以便某些“自动化”功能正常运行。如果需要一个未指定的参数才能完成某项功能,Office 会用一个模式对话框提示用户,询问用户要进行什么操作。非交互式桌面上的模式对话框是无法取消的,这就导致该线程无限期地停止响应。
3. 重入和可伸缩性:服务器端组件需要是具有较高可重入性的多线程 COM 组件,这些组件在有多个客户端时开销最少而吞吐量较高。Office 应用程序在几乎所有方面都正好相反。它们是非重入的“自动化”服务器,是为给一个客户端提供多种多样但占用资源较多的功能而设计的。它们作为服务器端解决方案可能会限制能够并发运行的实例的数量,而且,如果它们是在多客户端环境中配置的,还可能导致争用的情况。
4. 复原性和稳定性:Office 2000、Office XP 和 Office 2003 使用 Microsoft Windows 安装程序 (MSI) 技术,以使最终用户在进行安装和自行修复时更加容易。MSI 推出了“首次使用时安装”的概念,允许在运行时动态安装或配置功能。在服务器端环境中,这会既降低性能,又增加出现要求用户同意安装或提供相应安装盘的对话框的可能性。此外,在服务器端运行时,Office 的稳定性通常无法得到保障,因为它尚未为这样使用而进行设计或测试。在网络服务器上使用 Office 作为服务组件可能会降低这台计算机的稳定性,进而降低您的网络作为一个整体的稳定性。
5. 服务器端安全性:Office 应用程序从来都不是为在服务器端使用而准备的,因此,请不要考虑分布式组件所面临的安全性问题。Office 不对传入的请求进行身份验证,而且不会保护您免受无意中从服务器端代码中运行宏或启动另一台可能会运行宏的服务器的损害。
除了上述这些需要特别注意的问题外,我们在进行服务器端自动化时可能会遇到下列常见错误之一:
• “CreateObject/CoCreateInstance”返回以下运行时错误消息之一,而且无法启动进行自动化。
在 Microsoft Visual Basic (VB) 或 ASP 中:
• 消息 1: Run-time error '429': ActiveX component cannot create object
• 消息 2: Run-time error '70': Permission denied
在 Microsoft Visual C 或 Visual C++ 中:
• 消息 1: CO_E_SERVER_EXEC_FAILURE (0x80080005): Server execution failed
• 消息 2: E_ACCESSDENIED (0x80070005): Access denied
出现这些错误是因为服务器端代码在没有用户配置文件的情况下运行,或者为启动上下文指定的用户身份没有正确的 DCOM 权限。
• 打开 Office 文档会导致下列错误之一:
• 消息 1: Run-time error '5981' (0x800A175D): Could not open macro storage
• 消息 2: Run-time error '1004': Method '~' of object '~' failed
通常,出现这种情况是由于无法初始化 VBA,而无法初始化的原因是权限不足或缺少 VBA 组件注册,当用户从没有用户配置文件的帐户中运行代码(问题 1)并且用户标记不包含“交互式 SID”(问题 2)时,这两种原因都很常见。
• “CreateObject/CoCreateInstance”挂起并无法完成,或者需要很长时间才能返回。在有些服务器上,创建很快完成,但 Windows (NT) 事件日志中出现 1004 错误。
• 运行多个请求或压力测试可能导致在创建或终止 Office 应用程序时代码失败、挂起或崩溃。一旦出现这种情况,进程会在内存中保持运行状态且无法终止,或者正在自动化的应用程序的所有实例都从该点开始失败。