Microsoft.Office.Interop错误0x800401E3

时间:2013-02-22 11:02:55

标签: vb.net office-interop

我正在尝试通过服务(Windows服务)访问Microsoft word实例,但我收到此错误:

  

操作不可用(HRESULT异常:0x800401E3(MK_E_UNAVAILABLE))

我打开了一个word文档(我也可以在任务管理器中看到WINWORD.EXE )。我使用的是VS 2010和MS Office 2003.这是我的代码:

Dim fs As New FileStream("D:\log.txt", FileMode.OpenOrCreate, FileAccess.Write)
Dim sw As New StreamWriter(fs)
sw.BaseStream.Seek(0, SeekOrigin.End)
Dim wordapp As Word.Application
wordapp = Marshal.GetActiveObject("Microsoft.Office.Interop.Word.Application")
For Each doc As Word.Document In wordapp.Documents
    sw.WriteLine(doc.FullName.ToString() + "\n" +
    doc.ActiveWindow.WindowState.ToString())
Next
sw.Flush()
sw.Close()

如果我在Windows窗体应用程序中使用此代码,它可以完美地工作,但不能在 Windows服务中工作。这是为什么? Windows服务不支持Microsoft.Office.Interop?如果确实有效,请帮忙吗?

2 个答案:

答案 0 :(得分:2)

也许这就是您的代码在Windows窗体中运行的原因:

  

虽然Office应用程序正在运行,但可能未注册   在运行对象表(ROT)中。正在运行的Office实例   申请必须先在ROT注册才能加入   使用GetObject(Visual Basic)或GetActiveObject(Visual C ++)。

     

Office应用程序启动时,不会立即注册   它的运行对象。这样可以优化应用程序的启动过程。   Office应用程序不会在启动时注册,而是注册它   一旦失去焦点,在ROT中运行对象。因此,如果你   尝试使用GetObject或GetActiveObject附加到正在运行的   应用程序丢失之前的Office应用程序的实例   焦点,您可能会收到上述错误之一。

您的表单具有焦点,因此Office应用程序失去焦点并在ROT中注册。使用Windows服务Office不会失去焦点。

只需使用一些互操作winapi代码即可更改桌面上的焦点或minimeze办公室(或全部)窗口。但请记住,在ROT中注册(即使办公室失去焦点)不是决定性的,所以你必须循环尝试GetObject,直到你重新给出正确的反应。

答案 1 :(得分:0)