Internet Explorer において印刷中にモーダル ダイアログを表示すると、ハングアップする

適用対象: Internet Explorer 10Internet Explorer 11

現象


Internet Explorer 10 および Internet Explorer 11 で印刷処理中にモーダル ダイアログを表示すると、ハングアップする場合があります。プリンター ドライバーによっては、以下のような場合にモーダル ダイアログを表示しますが、このときタイミングによっては Internet Explorer がハングアップします。
  • 印刷結果を保存するファイル名を指定するために、[ファイルを開く] ダイアログを表示する
  • 印刷するユーザーを認証するために、[ユーザー認証] ダイアログを表示する
  • その他、プリンター ドライバー固有の印刷設定のために、[詳細設定] ダイアログを表示する

原因


本現象は、Internet Explorer 内において、描画処理用の同期オブジェクトとウィンドウ管理機能が競合し、デッドロックに至るために発生します。

解決方法


Internet Explorer の設定では、この現象を回避することができません。プリンター ドライバーでは、Internet Explorer のプロセス外にてダイアログを表示することで回避が可能です。

状況


弊社では、本現象を Windows 8 および Windows 7 用の Internet Explorer 10、Windows 8.1 および Windows 7 用の Internet Explorer 11 の問題と認識しています。

詳細


Internet Explorer 10 および Internet Explorer 11 が使用する HTML レンダリング モジュール "mshtml.dll" では、印刷時に描画処理用の同期オブジェクトをロックします。また、この同期オブジェクトをロックした状態でプリンター ドライバーを呼び出します。このとき、プリンター ドライバーから GetSaveFileName 関数や PrintDlg 関数などを使用してモーダル ダイアログを表示すると、フォーカス処理などのウィンドウ メッセージが mshtml.dll のウィンドウに送信されます。しかし、mshtml.dll では描画処理用の同期オブジェクトがロックされた状態であるため、メッセージを処理できません。その結果、ほかの処理も進められず、デッドロックが発生します。