C# COM オフィス オートメーション - RPC_E_SYS_CALL_FAILED
質問
PowerPoint 2007 プラグインとして機能する C# プログラムを作成しています。一部のマシンでは、PowerPoint オブジェクト モデルへの呼び出しによって、 COMException
メッセージと一緒に RPC_E_SYS_CALL_FAILED
. 。このエラーに関して何をすべきか、またはそれを回避する方法についての具体的なアドバイスは見つかりませんでした。グーグルで調べてみると、メッセージキューまたはシングルスレッドアパートメントに関係しているようです。それとも私は遠ざかっていますか?
エラー メッセージの例は次のとおりです。
システムコールが失敗しました。(HRESULT からの例外:0x80010100 (RPC_E_SYS_CALL_FAILED))
Microsoft.Office.Interop.PowerPoint._Presentation.get_FullName() で
残念ながら、問題はクライアントのマシンで発生しているため、簡単にデバッグする方法はありません。このエラーが発生するたびに呼び出しを再試行する必要がありますか?
この問題の解決に役立つアドバイスをいただければ幸いです。
解決
それがあなたの問題に関連しているかどうかはわかりませんが、すべての COM 呼び出しは、アドインが作成されたのと同じスレッド内から行われる必要があります。新しいスレッドを作成した場合は、特別な注意が必要です。詳細については、次の 2 つの記事で説明されています。
他のヒント
ApartmentState が設定されたスレッドから呼び出しを行っていますか?そうでない場合は、それが原因である可能性があります - COM 相互運用機能はその種のことに非常にうるさいです
クライアントのセキュリティ設定は何ですか?クライアントのセキュリティ設定 (Windows/OS 設定または PowerPoint/アプリ設定) により、プラグインが RPC 経由で通信できない可能性が十分にあります。
これは、バックグラウンド スレッドから Powerpoint オブジェクト モデルへの呼び出しを行う場合に非常に簡単に発生します。考えられるシナリオの 1 つは、何らかのステータス値を定期的にチェックするタイマーを使用することです。タイマーが作動したときに、Powerpoint がビジー状態 (ダイアログ ボックスが開いているなど) の場合、通話は失敗します。
この Microsoft の記事では、Office でのスレッド サポートの概要が説明されています。http://msdn.microsoft.com/en-us/library/8sesy69e.aspx