2009-03-26 32 views
2

私は単語の自動化アプリケーションを開発していると私は予想外のRPC/COMキャスト例外WordのオートメーションInvalidCastExceptionがRPC/COM例外

で深刻な問題に直面しています[型のオブジェクトをキャストするSystem.InvalidCastExceptionのない COM 'システム.__ ComObject' タイプのインタフェース 'Microsoft.Office.Interop.Word._Application'。サーバ:QueryInterfaceを COMコンポーネントを呼び出すとインタフェース IID「{} 00020970-0000-0000-C000-000000000046」 次のエラーに失敗したの識別子を取得するため この操作は失敗しましたRPC 利用できません。 (HRESULTからの例外: 0x800706BA)]

翻訳ポーランドそれAngielskiから:。

システム.__ ComObjectをキャストすることができませんが Microsoft.Office.Interop.Word._Applicationです。 0x800706BA

ここでは、モジュールの簡単なwordapp: - RPCサーバーを利用できません - エラーコードのHRESULT理由 はQueryInterfaceをが IIDは '{} 00020970-0000-0000-C000-000000000046' が失敗したということです

初期化 - ユーザーがログインされた後。

using Microsoft.Office.Interop.Word; 

    public class WordApp  
    { 
     Application app = null; 
     object m = System.Reflection.Missing.Value; 
     object oFalse = false; 
     object oTrue = true; 

....

  app = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application.12")) as Application; 
      app.Visible = false; 
      app.DisplayAlerts = WdAlertLevel.wdAlertsNone; 
      app.PrintPreview = false; 

私の代わりにアプリ=新しいアプリケーション()のActivator.CreateInstance使用しています - ここexplanationを。

そしてユーザのユーザログアウトが、私は放すA)プリント調製DOCX文書

 System.Windows.Forms.PrintDialog pd = new System.Windows.Forms.PrintDialog(); 
     ... 

     this.app.ActivePrinter = pd.PrinterSettings.PrinterName; 
     object oNumcopies = pd.PrinterSettings.Copies; 
     object oRange = WdPrintOutRange.wdPrintAllDocument; 
     object inputname = fullPath; 
     Document doc = app.Documents.Add(
           ref inputname, 
           ref m, 
           ref m, 
           ref m); 
     try 
     { 
      // Print the document 
      doc.PrintOut(ref oFalse, ref oFalse, ref oRange, 
        ref m, ref m, ref m, 
        ref m, ref oNumcopies, ref m, ref m, 
        ref oFalse, ref m, ref m, 
        ref m, ref m, ref m, ref m, 
        ref m); 
     } 
     finally 
     { 
      doc.Close(ref oFalse, ref m, ref m); 
      doc = null; 
     } 

B)変換DOCXはMHT

 object inputname = docxname; 
     object outputname = htmlname; 
     object fileType = WdSaveFormat.wdFormatWebArchive; 

     Document doc = app.Documents.Add( 
           ref inputname, 
           ref m, 
           ref m, 
           ref m); 
     try 
     { 
      doc.SaveAs(ref outputname, ref fileType, 
       ref m, ref m, ref m, ref m, ref m, ref m, ref m, 
       ref m, ref m, ref m, ref m, ref m, ref m, ref m); 
     } 
     finally 
     { 
      doc.Close(ref oFalse, ref m, ref m); 
      doc = null; 
     } 

ある

wordappモジュール内の2つのアクションを実行することができ単語のインスタンス:

  object oSaveChanges = WdSaveOptions.wdDoNotSaveChanges; 
      app.Quit(
     ref oSaveChanges, 
     ref m, 
     ref m); 

例外がランダムな場所に投げ出される - しかし、最も一般的な場所はapp.Documents.Addの近くにあります。それの後にその例外ではapp.Quitことはできません。単語のインスタンスが死んでいるようです。

Iは、イベントログ(アプリケーションスコープ)にそのことを発見した:

のEventType offdiag12、P1 585d8a02-f370-4c04-85b6-fccad7e80459255ec053-6dbd-4a22-9e59-112a79de8c6a、 NILのP2、P3 NIL 、NIL P4、P5 NIL、NIL P6、P7 NIL、NIL P8、P9 NIL、P10のNIL。

診断を実行してもエラーは見つかりませんでした。

システムからさらにエラー情報を有効にする/見つけ出すことは可能ですか?

このコードは、私の開発マシン(Vista)で完璧に動作します。この問題は、顧客のマシン(通常winxp sp2/sp3)で発生します。

コードにエラーがありますか?

私が追加する必要がある唯一のもの。 WordModuleのinit/close/print関数は、メインスレッドから呼び出され、savetomhtはバックグラウンドワークスのスレッドから呼び出されます。

答えて

4

多くの場合、次のような状況があります。 COM out-procサーバー(プログラムと同じプロセスではなく別のプロセスでインスタンス化されたCOMオブジェクト)を使用し、何らかの理由でCOMサーバーに致命的なエラーが発生し、予期せず終了します。使用していたCOMオブジェクトが存在しなくなりました。 RPCはout-proc COMサーバーと対話するために使用され、終了後にサーバー側は存在しなくなるため、RPCサーバーが利用できないというエラーメッセージが表示されますが、これは真実ですが混乱します。

COMサーバーの終了の理由を調査しなくてはなりません。最も可能性が高い理由は次のとおりです。

  • いくつかの不合理な入力を使用すると、通話や
  • イベントハンドラで未処理の例外に渡す値。 COMコンポーネントから起動されたイベントを処理する場合は、ハンドラ内でスローされる可能性のあるすべての例外をキャッチし、ハンドラの外側に伝播させないようにする必要があります。
+0

ええ、私はそういうことに同意します。 今、問題は、私はどのようにワードアプリケーションのインスタンスがシャットダウンされた検出するための考えがありませんです。単語のロギングエラーを有効にすることは可能ですか? – tomo

+0

ロギングを有効にする方法はありませんが、問題の原因を突き止めることができます。イベントハンドラはありますか?もしそうなら、そのうちのどれかが外に例外を伝播しますか?おそらくnullではない可能性の高いパラメータにはnullを渡しますか? – sharptooth

+0

私はそれが無効なパラメータの問題だとは思わない - これらのオフィス機能を呼び出すのは通常機能し、オフィスがなくなるときには電話を除外するためです。 イベントハンドラのアイデアは得られません。 私ができることは、単語を非表示にしてメッセージレベルをすべてに設定し、何かが表示されるかどうかを見ることだけです。 – tomo

1

よくわかりませんが、ここには一般的な経験に基づいた提案があります。すべてのパラメータ間で値を共有するのではなく、別のmを使用してみてください(値が内部で混乱していると予測できない結果になる可能性があります)。また、可能な限りどこでも合理的な値(mではなく)を試してみてください。いくつかのバージョンのAPIは、他のバージョンよりも寛容であるかもしれません。

関連する問題