この記事は、XPS ドキュメント ライター プリンターに印刷しているアプリの背後で [名前を付けて保存 ] ダイアログ ボックスが非表示になり、アプリケーションが応答を停止する問題を解決するのに役立ちます。
元の製品バージョン: XPS ドキュメント ライター
元の KB 番号: 2567869
症状
次のシナリオを考えてみましょう。
- 64 ビット バージョンの Windows 7 で 32 ビット アプリケーションを実行します。
- アプリケーションから Microsoft XPS Document Writer (MXDW) プリンターに印刷します。 このシナリオでは、[ 名前を付けて保存 ] ダイアログ ボックスがアプリケーションの背後に表示されます。
さらに、次の現象が発生する可能性があります。
- ファイル名を入力するか、印刷タスクを取り消すまで、アプリケーションは応答を停止する (ハングする) ようです。
- [名前を付けて保存] ダイアログ ボックスを閉じると、印刷するアプリケーションはフォアグラウンド (アクティブ) アプリケーションになりません。
注
この問題は、ドライバーが [ 名前を付けて保存] ダイアログ ボックスまたは別のモーダル ダイアログ ボックスを表示する別のプリンターに印刷するときにも発生する可能性があります。 Adobe PDF プリンターのプリンター ドライバーは、この種類のドライバーです。
原因
プリンター ドライバーは、印刷するプロセスに読み込まれるダイナミック リンク ライブラリ (DLL) として実装されます。 プリンター ドライバーは、64 ビット バージョンの Windows では 64 ビット DLL として、32 ビット バージョンの Windows では 32 ビット DLL として実装されます。
32 ビット プロセスでは、64 ビット DLL を読み込めませんでした。 そのため、64 ビット 版の Windows では、32 ビット プロセスから Splwow64.exe プロセスまでの印刷がサポートされます。 Splwow64.exe は、64 ビット プリンター ドライバーを読み込むことができる 64 ビット プロセスであり、32 ビット プロセスの印刷を処理します。
アプリケーションが StartDoc
関数を呼び出して XPS ドキュメント ライター プリンターに印刷すると、XPS ドキュメント ライター プリンター ドライバーに [名前を付けて保存 ] ダイアログ ボックスが表示され、ユーザーは XPS ファイルの名前と場所を指定できます。 ダイアログ ボックスの所有者ウィンドウは、通常、 StartDoc
関数を呼び出しているスレッドのアクティブ ウィンドウであり、ダイアログ ボックスがアクティブ ウィンドウの上に表示されます。
32 ビット アプリケーションが 64 ビット バージョンの Windows で StartDoc
関数を呼び出すと、Splwow64.exe プロセスは 32 ビット アプリケーションの XPS ドキュメント ライター プリンター ドライバーを呼び出します。 このシナリオでは、Splwow64.exe プロセスのスレッドにアクティブなウィンドウがないため、[ 名前を付けて保存] ダイアログ ボックスは未所有です。 Splwow64.exe プロセスにフォアグラウンド ウィンドウを設定する権限がないため、印刷中のアプリケーションの背後にダイアログ ボックスが表示されることがあります。 また、ダイアログは未所有であるため、 StartDoc
関数を呼び出したアプリケーションは、ダイアログを閉じたときにフォアグラウンド アプリケーションにならない可能性があります。
StartDoc
呼び出しは、ダイアログ ボックスが閉じられるまで戻らないので、アプリケーションが応答を停止するように見える場合があります。
[ 名前を付けて保存 ] ダイアログ ボックスは、Splwow64.exe プロセスによって作成された場合、Windows エクスプローラーのタスク バーに独自のボタンがあります。 これは、ダイアログ ボックスが未所有であるためです。 タスク バー ボタンは、Splwow64.exe プロセスでフォアグラウンド ウィンドウを設定できない場合にも点滅します。
対処法
この問題を回避するには、タスク バー ボタンから [名前を付けて保存 ] ダイアログ ボックスにアクセスします。 または、Alt キーを押しながら Tab キーを押して、フォーカスをダイアログ ボックスに切り替えることができます。
詳細情報
ソフトウェア開発者は、ユーザーが XPS ドキュメント ライター プリンターまたは Adobe PDF プリンターに印刷するタイミングをこれらのアプリケーションで検出することで、32 ビット アプリケーションでこの問題を回避できます。 アプリケーションは、DOCINFO.lpszOutput
関数を呼び出すときに、StartDoc
構造体メンバー内のファイルへの完全なパスを指定します。 プリンター ドライバーは、ユーザーにファイルの入力を求める代わりに、指定されたファイルを使用します。
サードパーティの情報に関する免責事項
この記事で説明するサード パーティ製品は、Microsoft に依存しない企業によって製造されています。 明示的か黙示的かにかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。