我正在尝试通过服务(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
?如果确实有效,请帮忙吗?
答案 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)