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 の管理用ウィンドウが破棄された際にフォーム ビュー上のダイアログ コントロールにフォーカスが遷移する動作を抑制することが可能です。

状況

マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。

ヘルプを表示

スキルを磨く
トレーニングの探索
新機能を最初に入手
Microsoft Insider に参加する

この情報は役に立ちましたか?

フィードバックをお送りいただきありがとうございます!

フィードバックをお寄せいただき、ありがとうございます。Office サポートの担当者におつなぎいたします。

×