PowerPoint のオートメーションにてプリントアウトした場合、RPC_E_SERVERFAULT のエラーが発生することがある

現象

PowerPoint のオートメーションにて、外部のプログラムから、OLE オブジェクトや画像オブジェクトを含む PowerPoint ファイルをプリンタのプロパティを変更した直後に印刷を実行した場合、RPC_E_SERVERFAULT のエラーが発生する場合があります。

原因

Office PIA にて実装されたメソッドは、クライアントアプリケーションから呼び出すと、PowerPoint (POWERPNT.EXE) を COM サーバーとして RPC プロトコルを使用してプロセス間通信が行われます。Office PIA 経由にて、外部プログラムから、PowerPoint 2007 ドキュメントを印刷する場合、 OLE や画像オブジェクトが埋め込まれていて、かつプリンタのプロパティを変更した直後に PrintOut メソッドを実行すると、プリンタ情報の更新と印刷が行われることになります。

ただし、この際にプリンタの状態やCOM サーバーの状態、あるいは、PowerPoint オブジェクトへのプロパティの状態を更新するために、時間を要することがあります。
その結果、PowerPoint 内で予期しない動作となり、RPC_E_SERVERFAULT のエラーがクライアントに返却されることがあります。ただし、内部的な処理に依存するため、常に発生する現象ではありません。

回避策

検討できる対処方法として、アンマネージドでのクライント コンポーネントとして印刷処理を実装します

状況

マイクロソフトでは、この問題について現在調査中です。詳細については、わかりしだいこの資料に掲載する予定です。

詳細

以下のようなコードで発生することがあります。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Core = Microsoft.Office.Core;
using System.Drawing.Printing;


namespace WindowsFormsApplication1
{

public partial class Form1 : Form
{

  public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
PowerPoint.Application oApp = new PowerPoint.Application();
PowerPoint.Presentation oPresentation;

string filePath = "PowerPoint ファイルの絶対パスを指定";
try
{

PowerPoint.Presentations presentations = oApp.Presentations;

Microsoft.Office.Core.MsoTriState openVisibleState = Microsoft.Office.Core.MsoTriState.msoFalse;

oPresentation = presentations.Open(filePath,
Microsoft.Office.Core.MsoTriState.msoTrue,
Microsoft.Office.Core.MsoTriState.msoFalse,
openVisibleState);

oPresentation.PrintOptions.PrintInBackground = Core.MsoTriState.msoFalse;

PrintDocument pd = new PrintDocument();
oPresentation.PrintOptions.ActivePrinter = pd.PrinterSettings.PrinterName;

oPresentation.PrintOut(1, -1, null, 1, Core.MsoTriState.msoFalse);

oPresentation.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(oPresentation);
oPresentation = null;

oApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(oApp);
oApp = null;

}
catch (Exception ex)
{
Console.WriteLine(ex.InnerException);
}
finally
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

}
}
}


 
プロパティ

文書番号:2651891 - 最終更新日: 2016/09/29 - リビジョン: 1

フィードバック