【问题标题】:Microsoft.Office.Interop error 0x800401E3Microsoft.Office.Interop 错误 0x800401E3
【发布时间】:2013-02-22 11:02:54
【问题描述】:

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

【问题讨论】:

    标签: vb.net office-interop


    【解决方案1】:

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

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

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

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

    只需使用一些互操作的 winapi 代码来更改焦点或最小化桌面中的办公室(或所有)窗口。但请记住,在 ROT 中注册(即使办公室失去焦点)不是确定性的,因此您必须执行循环尝试 GetObject 直到您得到正确的响应。

    【讨论】:

    • 谢谢,请指导我应该怎么做才能使我的服务正常工作,office如何在windows服务的情况下失去焦点,从而将office实例注册在rot中
    【解决方案2】:

    【讨论】:

    • 请在答案本身中包含您链接到的页面的相关部分。如果链接断开,您的答案将变得毫无用处
    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多