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

Windows services Powerpoint互操作在Windows服务中失败,但在Windows窗体应用程序中工作正常,windows-services,interop,powerpoint,Windows Services,Interop,Powerpoint,我编写了一个应用程序来查看文件夹,每当将PowerPoint文档放入其中时,它就会浏览其中的幻灯片,并生成每张幻灯片的png图像。这在windows窗体应用程序中工作正常,但我在windows服务中放入了完全相同的代码,使用了相同的测试文件,但无法打开,出现以下错误: 错误:PowerPoint无法打开该文件。 在Microsoft.Office.Interop.PowerPoint.Presentations.Open(字符串文件名,MSOTRestate只读,MSOTRestate无标题,M

我编写了一个应用程序来查看文件夹,每当将PowerPoint文档放入其中时,它就会浏览其中的幻灯片,并生成每张幻灯片的png图像。这在windows窗体应用程序中工作正常,但我在windows服务中放入了完全相同的代码,使用了相同的测试文件,但无法打开,出现以下错误:

错误:PowerPoint无法打开该文件。 在Microsoft.Office.Interop.PowerPoint.Presentations.Open(字符串文件名,MSOTRestate只读,MSOTRestate无标题,MSOTRestate WithWindow)-2147467259 Com错误

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


有什么建议吗?

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

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

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

一个名叫“Gary McGill”的家伙发布了一个非常适合我的解决方案(关于一个非常类似的问题):

工作起来很有魅力(我甚至不必在“登录”选项卡上选中“允许服务与桌面交互”复选框)

  • 进入组件服务>计算机>我的计算机>DCOM配置
  • 转到“Microsoft PowerPoint幻灯片”DCOM并选择属性
  • 转到“标识”选项卡,将被继承的用户更改为具有网络服务/访问权限的特定用户

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

我尝试了此操作,但出现了另一个错误:“无法使用与其底层RCW分离的COM对象”,我认为这与我在Vista中测试服务有关()我评估了一些组件,但是他们遇到了pptx不兼容和/或偶尔无法处理奇数文件的问题。Interop成功地通过了我测试的3-400个文件的100%。我认为你是对的,微软自己不推荐这种方法(),我认为稳定性比不能处理临时文件更好。将改用Aspose.Slides,这将在将来支持pptx。