印刷をする Windows サービス アプリケーション開発時の留意点

概要

Windows サービス アプリケーションはセッション 0 で動作するアプリケーションであり、セッション 0 で動作するアプリケーションからはユーザー インタフェースの表示などデスクトップに描画したりデスクトップの情報を参照することができません。
この制限は、Windows サービス アプリケーションから直接的にユーザー インタフェースを表示する処理のみならず、Windows サービス アプリケーションが利用する API がその処理の結果としてユーザーインタフェースを表示する場合も該当します。
また、Windows サービス アプリケーションからデスクトップへ描画したり、デスクトップ情報を参照するような処理は、Windows サービス アプリケーション内部のデッドロック等さまざまな問題の原因となり得るため、Windows サービス アプリケーションからこのような処理を行う可能性がある API を利用することは推奨されていません。また、ユーザ プロファイルにアクセスすることがある可能性がある API もセッション 0 以外のユーザー セッションにおいて動作するアプリケーションからの利用を前提としているため、同様な理由により利用は推奨されていません。

詳細

デスクトップへの描画したり、デスクトップ情報を参照するような処理を行う API の例として、USER32.DLL, GDI32.DLL, WINSPOOL.DRV などで提供しているグラフィックスや印刷に関連した API が相当します。最も顕著な例は、GDI32.DLL や WINSPOOL.DRV から利用する印刷関連の API です。
GDI32.DLL や WINSPOOL.DRV などで提供されている印刷関連の API からは各種のダイアログ ウィンドウが表示される可能性があります。また、プリンタ ドライバは、一定の条件下でダイアログの表示が許容されているため、ユーザー インターフェースを操作できないWindows サービス アプリケーションからこれらの API を利用することで、プリンタ ドライバからダイアログ ウィンドウが表示される可能があります。
このように、グラフィックスや印刷に関連した API はアプリケーションから制御できない要因でデスクトップに描画したり、デスクトップ情報を参照する可能性があるため、Windows サービス アプリケーションからの利用は推奨されていません。

回避策

デスクトップに描画したり、デスクトップ情報を参照する可能性がある API は、ユーザー セッション上で動作するアプリケーションから利用することを推奨します。
また、Windows サービス アプリケーションからユーザー セッション上で動作するプロセスを生成する方法の例として CreateProcessAsUser() 関数などの API を呼び出す方法があります。

関連情報

セッション 0 で動作するWindows サービス アプリケーションやドライバに関する技術情報は以下のドキュメントを参照してください。

Impact of Session 0 Isolation on Services and Drivers in Windows
プロパティ

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

フィードバック