1

サービス(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 Forms アプリケーションで使用すると、完全に機能しますが、Windows Service では機能しません。何故ですか?Windows サービスはサポートしていませんMicrosoft.Office.Interopか? それが機能する場合は、助けてください?

4

2 に答える 2

2

おそらくこれが、コードが Windows フォームで機能する理由です。

Office アプリケーションは実行されていますが、実行中のオブジェクト テーブル (ROT) に登録されていない可能性があります。Office アプリケーションの実行中のインスタンスは、GetObject (Visual Basic) または GetActiveObject (Visual C++) を使用してアタッチする前に、ROT に登録する必要があります。

Office アプリケーションが起動しても、実行中のオブジェクトがすぐに登録されるわけではありません。これにより、アプリケーションの起動プロセスが最適化されます。Office アプリケーションは、起動時に登録するのではなく、フォーカスを失ったときに実行中のオブジェクトを ROT に登録します。したがって、アプリケーションがフォーカスを失う前に、GetObject または GetActiveObject を使用して Office アプリケーションの実行中のインスタンスにアタッチしようとすると、上記のいずれかのエラーが発生する可能性があります。

フォームにフォーカスがあるため、Office アプリはフォーカスを失い、ROT に登録されます。Windows サービスを使用すると、Office はフォーカスを失うことはありません。

デスクトップでフォーカスを変更したり、オフィス (またはすべて) のウィンドウを最小化したりするには、相互運用性の ​​winapi コードを使用するだけです。ただし、ROT への登録 (オフィスがフォーカスを失った場合でも) は決定論的ではないため、正しい応答が得られるまで GetObject を試行するループを実行する必要があることを覚えておいてください。

于 2013-02-22T11:19:45.737 に答える
0

このスレッドをチェックアウトしてください、それはあなたを助けるかもしれません:

http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/e6b94d33-fee9-4696-8618-3e798d329d80

于 2013-03-18T12:16:34.380 に答える