Powerpoint Interop 在 Windows 服务中失败,但在 Windows 窗体应用程序中工作正常

Posted

技术标签:

【中文标题】Powerpoint Interop 在 Windows 服务中失败,但在 Windows 窗体应用程序中工作正常【英文标题】:Powerpoint Interop fails in a Windows Service but works fine in a Windows Form application 【发布时间】:2009-04-08 11:40:53 【问题描述】:

我编写了一个应用程序来监视文件夹,每当将 PowerPoint 文档放入其中时,它都会遍历其中的幻灯片并生成每张幻灯片的 png 图像。这在 Windows 窗体应用程序中运行良好,但我在 Windows 服务中放置了完全相同的代码,使用了相同的测试文件,但无法打开它并出现以下错误:

错误:PowerPoint 无法打开文件。 在 Microsoft.Office.Interop.PowerPoint.Presentations.Open(String FileName, MsoTriState ReadOnly, MsoTriState Untitled, MsoTriState WithWindow) -2147467259 Com 错误

我已将服务设置为使用我自己的用户帐户(具有管理员权限)运行,因此我认为这可以排除权限问题,但我想不出其他可以尝试的方法。

有什么建议吗?

【问题讨论】:

【参考方案1】:

一个名叫“Gary McGill”的人发布了一个对我来说效果很好的解决方案(关于一个非常相似的问题):

Automating Office via Windows Service on Server 2008

像魅力一样工作(我什至不必选中“登录”选项卡上的“允许服务与桌面交互”复选框)

【讨论】:

【参考方案2】:

如果没有更多信息,就无法判断问题所在。它可以是任何数量的东西。如果操作系统是 XP 或更早版本,则在服务运行时不会加载用户的配置文件,因此 PP 可能无法访问它需要的某些信息。 PP 可能正在尝试一些复杂的操作,假设它处于交互式会话中。由于缺少用户配置文件,PP 使用的 COM 组件可能无法初始化。真正的错误甚至可能不是安全问题,开发人员使用 ERROR_ACCESS_DENIED 或 ERROR_OUT_OF_MEMORY 来捕获所有意外错误的情况并不少见。

但真正的问题是 PowerPoint 在很大程度上是一个用户级应用程序 - 它不应该在服务中使用。将服务设置为与桌面交互是一个糟糕的解决方案。即使它确实有效,它也只会掩盖更深层次的问题,并使其作为服务运行变得毫无意义。有许多实用程序和组件可用于将 PowerPoint 幻灯片转换为图像文件。在 Google 上进行快速搜索会返回许多看起来更适合在服务中使用的可能性,而且其中大多数都非常便宜。

【讨论】:

我评估了一些组件,但它们遭受 pptx 不兼容和/或偶尔无法处理奇怪文件的问题。 Interop 成功地通过了我测试过的 3-400 个文件中的 100%。 我认为你是对的,微软自己不推荐这种方法(support.microsoft.com/default.aspx?scid=kb;en-us;257757),我认为稳定性比不能处理偶尔的文件更可取。将改用 Aspose.Slides,将来会支持 pptx。【参考方案3】: 进入组件服务>计算机>我的电脑>DCOM 配置。 转到“Microsoft PowerPoint 幻灯片”DCOM 并选择属性。 转到身份选项卡并将用户从被继承更改为具有网络服务/访问权限的特定用户。

PowerPoint 互操作不应尝试打开 UI,但这也可能是问题所在。

【讨论】:

【参考方案4】:

尝试将服务设置为与桌面交互。

【讨论】:

我尝试了这个并得到了一个不同的错误:“无法使用已与其底层 RCW 分离的 COM 对象”我认为这与我在 Vista 中测试服务有关 (microsoft.com/whdc/system/vista/services.mspx)

以上是关于Powerpoint Interop 在 Windows 服务中失败,但在 Windows 窗体应用程序中工作正常的主要内容,如果未能解决你的问题,请参考以下文章

(C# / VB.NET) Microsoft.Office.Interop.PowerPoint.Shape.AddComment - 当“Microsoft Office”版本高于 2010 时出

如何使用C#操作幻灯片

PowerPoint 互操作:如果完成速度过快,复制粘贴形状会崩溃

将击键发送到 PowerPoint 窗口

如何使用 C# 2.0 将数据表的内容推送到 powerpoint 幻灯片

vsto之PPT幻灯片切换事件