Visual Studio 2008以降で サンプルの MFC アプリを実行すると大変なことに

VC++ 2008/2010/2012 などのウィザードでMFCのサンプルアプリのテンプレートをそのまま使うと大変なことになります。

mfc
具体的にはこう

ツールバーを使用する MFC アプリケーションで起動に失敗する場合がある

Visual C++ 2008 SP1 以降の MFC アプリケーション (CWinAppEx クラスを使用)
では、アプリケーションの起動時に、ツールバーやドッキング
コントロールの状態を前回アプリケーション実行時の状態に復元する機能が提供されています。前回実行時の状態はレジストリに保存されています。

のレジストリからの状態復元処理において、アプリケーション起動時の初期状態のツールバー メニュー ボタン
(CMFCToolBarMenuButton)
オブジェクトの状態と、レジストリから読み込んだ前回の状態との比較が行われますが、特定の条件下において、レジストリから読み込んだ情報から生成された
オブジェクトが必要な情報を持たない状況が発生します。

具体的には、CMFCToolBarMenuButton クラスの一部の情報を持たず、基底クラスの CMFCToolBarButton クラスの情報のみを持っているため、オブジェクトのサイズとしても必要な領域が確保されていない状態となります。
その結果、初期状態と前回実行時の CMFCToolBarMenuButton オブジェクトの比較処理において、上記の不足分の領域に対応する不正なアドレスへの参照が行われ、アクセス違反によるアプリケーションの異常終了が発生します。

問題発生時に、前回アプリケーション実行時のコントロールの状態を保存した以下のレジストリ キーを削除します。

レジストリ上に保存された前回実行時の状態を削除することで、問題が生じる比較処理が行われないようにします。
レジストリ操作については不適切な操作を行わないように十分留意する必要がありますが、本キーの削除は本問題に対する適切な対処方法となり、アプリケーションの動作自体や他のアプリケーションに対する影響はありません。

HKEY_USERS\<ユーザーの SID>\Software\アプリケーション ウィザードで生成されたローカル アプリケーション\<アプリケーション名>

いやすぎる・ω・

 // TODO: この文字列を、会社名または組織名などの、
 // 適切な文字列に変更してください。
 SetRegistryKey(_T("アプリケーション ウィザードで生成されたローカル アプリケーション"));
 LoadStdProfileSettings(4);  // 標準の INI ファイルのオプションをロードします (MRU を含む)

元のソース

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です