Chapter.24

IPrint


1.IPrintとIContinueCallback

OLEにはIPrintというプログラムによる印刷を行うためのインターフェースが定義されています。このインターフェースはDEVMODEDEVNAMESをマーシャリングすることにより印刷を詳細に制御することが可能です。実際にはDEVMODEDEVNAMESDVTARGETDEVICEに含めてマーシャリングされます。なお、DVTARGETDEVICEにはDEVMODEのドライバ拡張部分を含めることが出来るため、PDFを出力する仮想プリンタドライバ等のようなDEVMODEの仕様が公開されたプリンタを扱うのに便利です。
難点としては、IPrintを実装したサーバがそれほど多くないです。現時点で確実に実装していると断言できるサーバは、Microsoft ExcelとMicrosoft Wordぐらいです。この状況は今後も変わらないでしょうが、業務アプリケーションを作成する上では、この二つが実装していれば困ることは無いと思います。

IPrintはサーバ側が実装するインターフェースですが、これに対してクライアントはIContinueCallbackを実装するこにより、進捗の取得および印刷の中断を行うことができます。必要なインターフェースはこの2つだけですので、先にサンプルを提示します。

VB.NETサンプルソース:chap24.vb.lzh (32KB 2007/7/16)
C#サンプルソース:chap24.cs.lzh (32KB 2007/7/16)


2.Marshal.BindToMonikerノスヽメ

Excelの場合、IPrintインターフェースはWorkbookオブジェクトに実装されているので、まず始めにWorkbookオブジェクトを取得する必要があります。OfficePIAを使用する場合、Application.Workbooks.OpenメソッドでWorkbookオブジェクトを取得することができます。この際、ApplicationオブジェクトとWorkbooksオブジェクトへの暗黙的な参照を避けるため、これらの明示的な参照を保持しておかなければなりませんが、Marshal.BindToMonikerを使用した場合、ファイルから直接Workbookオブジェクトを取得することができます。サンプルにOfficePIAを添付しなくても済むように、今回はこの手法を使用しています。

Marshal.BindToMonikerを使用した場合、副次的な作用として現在開いているファイルの参照も取得してしまいます。
参考:KB316126
また、ファイルを開く前にApplication.DisplayAlertsプロパティといったApplicationオブジェクト自体を操作したい場合にも使用することはできません。ファイルを開いた後であれば、Workbook.ApplicationプロパティからApplicationオブジェクトを取得することは可能です。

Marshal.BindToMonikerノスヽメとか書いていますが、Marshal.BindToMonikerとOfficePIAのどちらを使用するかは仕様に依存せざるを得ないと思います。


3.まとめ

IPrintを使用することにより印刷を詳細に制御することが理解していただけば幸いです。

この章を記述するにあたり、IPrintの資料はほとんどありませんでしたが、これは適用可能な状況が少ないためだと思います。サーバ上での自動印刷のニーズはあると思いますが、サーバサイドオートメーションは推奨されていないため、これらを組み合わせることは難しい状況も多いでしょう。私がIPrintを使用した状況とは、Excelオートメーションで作った帳票をPDF変換用の仮想プリンタドライバでPDF化するという要件でした。ExcelをVB.NETやC#で操作するのはめんどくさいので、ExcelファイルをVBSで作成した後、ファイルを保存してVBSが終了してから印刷(PDF変換)していました。まぁ、そのIPrintによる印刷部分もC++で作っており.NET Frameworkの片鱗すら無かったのですが・・・。

リンクコンテナの解説がめんどくさくなってきたので、ちょっと休憩。次回からはリンクコンテナの解説に戻りたいと思います。


前へ 次へ
OLE on .NET Frameworkへ
総合トップへ

サンプルで使用しているキーワード
DEVMODE DEVNAMES DVTARGETDEVICE IContinueCallback IPrint PAGERANGE PAGESET System.Windows.Forms.PrintDialog System.Runtime.InteropServices.Marshal.BindToMoniker