Kei*_*h K 8 c# interop windows-services ms-word
我有一个用c#编写的Windows服务,它使用VBA Interop从word文档(doc和docx)中读取文本.但是在某些文档上似乎挂起了对Open方法的调用.似乎问题文档中都有宏.本地安装的word版本已禁用宏,我用来打开文档的代码如下:
using Word = Microsoft.Office.Interop.Word;
using OfficeCore = Microsoft.Office.Core;
Word.Application m_wordApp = new Word.ApplicationClass();
Word.Document m_wordDoc = null;
object TRUE_VALUE = true;
object FALSE_VALUE = false;
object MISSING_VALUE = System.Reflection.Missing.Value;
m_wordApp.DisplayAlerts = Microsoft.Office.Interop.Word.WdAlertLevel.wdAlertsNone; //will still fail with this line removed
m_wordApp.Visible = false; //will still fail with this line removed
m_wordApp.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityForceDisable; //will still fail with this line removed
m_wordDoc = m_wordApp.Documents.Open(ref fileNameObject, ref FALSE_VALUE, ref TRUE_VALUE, ref FALSE_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref FALSE_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE);
Run Code Online (Sandbox Code Playgroud)
我可以在我的开发机器上手动处理这些文档.有谁知道为什么会发生这种情况或对我的问题有任何进一步的疑问?
Microsoft.Office.Interop.Word使用COM包装器远程控制实际的Word可执行文件.这绝对是可怕的.在其正在使用的Word副本中禁用宏的设置几乎肯定是用户特定的设置,Windows服务将运行Word作为运行该服务的任何用户帐户.很有可能它实际上是在一些理论上的netherworld中出现了某种宏安全对话框,即Windows服务用户desktop/ui.
我希望最终找到与此相关的所有问题,并最终使用以下行打开文档:
m_wordApp.Documents.Open(ref fileNameObject, ref FALSE_VALUE, ref TRUE_VALUE, ref FALSE_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref FALSE_VALUE, ref TRUE_VALUE, ref MISSING_VALUE, ref TRUE_VALUE, ref MISSING_VALUE);
Run Code Online (Sandbox Code Playgroud)
第 4 个和第 2 个最后一个参数阻止打开修复和编码对话框,这些对话框修复了大多数错误。
在没有通知的情况下禁用宏的注册表项是:
[HKEY_USERS\S-x-x-xx-xxxxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xxx\Software\Microsoft\Office\12.0\Word\Security]
"VBAWarnings"=dword:00000004
Run Code Online (Sandbox Code Playgroud)
最后,毕竟仍然存在使服务崩溃并泄漏 winword 实例的文档。以服务用户身份登录并打开这些文档之一后,我从 word 中收到了此消息对话框:“Word 无法启动转换器 mswrd632”。这是通过删除注册表项来解决的,如http://support.microsoft.com/kb/973904 中所述。
编辑:我还发现,因为没有安装 VBA,Word 打开了一个对话框来告诉服务这导致某些文档挂起服务。重新安装它然后禁用 Word 本身(如上所述)得到了更多的文档处理。还有一些文件无法处理。考虑使用 ikvmc尝试http://poi.apache.org/text-extraction.html来解析文档。