保護モードの機能が有効な Internet Explorer 8 上で動作する ActiveX コントロールで PrintDlgA 関数を使用すると、印刷ダイアログ ボックスを表示できない

現象
Windows Internet Explorer 8 上で動作する ActiveX コントロールが、PrintDlgA 関数を使用して印刷ダイアログ ボックスを表示している場合、保護モードの機能が有効な Internet Explorer 8 では印刷ダイアログ ボックスを表示できません。
原因
この現象は、Internet Explorer 8 における、プロセス モデルの変更にもとづいて発生します。

Internet Explorer 8 では、各タブ ウィンドウをホストする UI フレーム ウィンドウとドキュメントを表示するタブ ウィンドウとが、別々のプロセスとして動作するようにプロセス モデルが変更されています。Internet Explorer 8 での新しいプロセス モデルは、Loosely-Coupled IE (LCIE) と呼ばれます。

LCIE 機能が有効の場合 (既定では有効)、各タブ、および window.open メソッドなどで開かれたウィンドウは別々のプロセスで動作し、各タブ プロセスごとに保護モードの設定が適用されます。保護モードが有効である場合、Windows の持つユーザーアカウント制御 (UAC) と整合性機構を使用して、低い整合性レベル (IL: Integrity Level) でタブ プロセスを起動します。一方、UI フレーム ウィンドウ (IEFrame) のプロセスは、保護モードの設定にかかわらず、"中 IL" で起動します。したがって、UI フレーム ウィンドウ (IEFrame) のプロセスとタブ プロセスとで IL が異なります。

PrintDlg 関数などで作成されるモーダル ダイアログは、タブ プロセスに属しますが、"低 IL" と "中 IL" のプロセス間ではウィンドウ メッセージの送信が制限されるため、IEFrame を直接親ウィンドウにすると不都合が生じます。そのため、Internet Explorer 8 は、PrintDlg 関数などのモーダル ダイアログを表示する関数 (MessageBox 関数、DialogBoxParam 関数、PropertySheet 関数など) の呼び出しをフックし、IL の違いによるセキュリティ境界の制限を回避するよう動作します。

しかし、PrintDlg 関数は、Internet Explorer 8 は Unicode 版の PrintDlgW 関数のみしかフックしません。そのため、PrintDlgA 関数が直接呼び出され、上記の UI フレームのプロセス (IEFrame) とタブ プロセスの IL の違いによるセキュリティ境界の制限により、関数の実行に失敗します。
回避策
この現象を回避するには、PrintDlgA 関数の代わりに、Unicode 版の PrintDlgW 関数を使用してください。
状況
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。
関連情報
関連情報を参照するには、次のマイクロソフト Web サイトを参照してください。
IE8 と Loosely-Coupled IE (LCIE)
http://msdn.microsoft.com/ja-jp/ie/cc787974.aspx
保護モードの Internet Explorer の理解と機能
http://msdn.microsoft.com/ja-jp/library/bb250462.aspx
プロパティ

文書番号:2391377 - 最終更新日: 10/04/2016 14:34:00 - リビジョン: 4.0

Windows Internet Explorer 8

  • kbharmony kbexpertiseadvanced kbtshoot kbbug kbnofix KB2391377
フィードバック