MFC アプリケーションを終了するとき、Microsoft IME を使用しているとアクセス違反が発生する

現象
Windows 7 または Windows Server 2008 R2 上で、ユーザー インターフェイスを持つ Microsoft Foundation Class (MFC) アプリケーションを終了するとき、アクセス違反が発生しアプリケーションが異常終了することがあります。

また、このとき、「動作を停止しました」というエラー ダイアログが表示される場合があります。


この現象は、以下の条件をすべて満たす場合に発生する可能性があります。
  • Windows 7 または Windows Server 2008 R2 上で、CFormView クラスなどコントロールをホスト可能なビューを持つ MFC アプリケーションを実行している
  • ビュー上に、CPropertySheet クラスなどを使用してダイアログ コントロールを配置している
  • 日本語入力システム (IME) に Microsoft IME を使用している
  • アプリケーションを起動後、一度も他のプロセスにフォーカスを遷移させていない
  • アプリケーションの初期化処理で、AfxOleInit 関数などによる明示的な COM の初期化を行っていない
補足: この現象は、Microsoft Office IME 2007 または Microsoft Office IME 2010 を IME として使用している場合は発生しません。

原因
フォーム ビュー上にダイアログ コントロールを持つ MFC アプリケーションは、プロセス終了時に Microsoft IME のモジュールをアンロードします。このとき IME の初期化処理で生成された COM の管理用ウィンドウがクローズされることにより、このウィンドウが持っていたフォーカスがダイアログ コントロールに遷移します。

フォーカスを得たダイアログ コントロールは IME の内部関数を呼び出しますが、既に IME のモジュールはアンロードされているため、アプリケーションにおいてアクセス違反が発生します。
回避策
この現象を回避するには、MFC アプリケーションにおいて次のいずれかの方法を実行してください。
なお、下記で使用している各関数の詳細については、Microsoft Developer Network (MSDN) ライブラリを参照してください。また、これらの方法を適用した場合、アプリケーションの動作に影響する可能性もありますので、関数の詳細を確認した上で十分なテストを実施してください。

方法 1: IME の終了処理が実行される以前のタイミングでアプリケーションのウィンドウを無効化し、更にウィンドウが持つフォーカスを外す


MFC アプリケーションのクローズ メッセージ ハンドラ (CWinApp 派生クラスの OnClose メンバ関数) などの終了処理時に、CWinApp 派生クラスの EnableWindow(FALSE) を呼び出してダイアログ コントロールのウィンドウを無効します。更に SetFocus(NULL) 関数を呼び出してこのウィンドウが持つフォーカスを外します。
IME の終了処理が実行される以前にウィンドウを無効化しフォーカスを外すことで、COM の管理用ウィンドウがクローズされた後にダイアログ コントロールにフォーカスが遷移することを抑止できます。

方法 2: IME モジュールのアンロード後にダイアログ コントロールがフォーカスを得ないようにアプリケーションを変更する

1 つの方法として、CWinApp 派生クラスの InitInstance メンバ関数など、MFC アプリケーションの初期化処理時に、AfxOleInit 関数を呼び出して明示的に COM を初期化する方法が考えられます。あらかじめ COM の初期化を実行しておくことにより、COM の管理用ウィンドウが破棄された際にフォーム ビュー上のダイアログ コントロールにフォーカスが遷移する動作を抑制することが可能です。

状況
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:2859678 - 最終更新日: 09/29/2016 15:01:00 - リビジョン: 3.0

Windows 7 Enterprise, Windows 7 Home Basic, Windows 7 Home Premium, Windows 7 Professional, Windows 7 Service Pack 1, Windows 7 Ultimate, Windows Server 2008 R2 Datacenter, Windows Server 2008 R2 Enterprise, Windows Server 2008 R2 Service Pack 1, Windows Server 2008 R2 Standard

  • kbtshoot kbbug kbnofix kbactivexevents KB2859678
フィードバック