私は単語の自動化アプリケーションを開発していると私は予想外の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はバックグラウンドワークスのスレッドから呼び出されます。
ええ、私はそういうことに同意します。 今、問題は、私はどのようにワードアプリケーションのインスタンスがシャットダウンされた検出するための考えがありませんです。単語のロギングエラーを有効にすることは可能ですか? – tomo
ロギングを有効にする方法はありませんが、問題の原因を突き止めることができます。イベントハンドラはありますか?もしそうなら、そのうちのどれかが外に例外を伝播しますか?おそらくnullではない可能性の高いパラメータにはnullを渡しますか? – sharptooth
私はそれが無効なパラメータの問題だとは思わない - これらのオフィス機能を呼び出すのは通常機能し、オフィスがなくなるときには電話を除外するためです。 イベントハンドラのアイデアは得られません。 私ができることは、単語を非表示にしてメッセージレベルをすべてに設定し、何かが表示されるかどうかを見ることだけです。 – tomo