【Visual C++ 2008】【MFC】
(追記) 2011年6月のWindows Updateにて、開発PCにMS11-025の修正版(KB2538241)をインストールした場合は、 以下の対処は不要です (実行ファイルのサイズは「サイズを小さくする方法」の手順1のみで小さくなる。また、Windows2000にて問題無く動作する)。 |
2011年4月のWindows Updateにて、開発PCにMS11-025(KB2465361)をインストール後、 「スタティックライブラリでMFCを使用する」プロジェクトをビルドした場合、生成された実行ファイルに以下のような問題がある。
- サイズが従来より大きくなる
- Windows2000にて実行できない
(エラーメッセージ「プロシージャエントリポイントFindActCtxSectionStringWがダイナミックリンクライブラリKERNEL32.dllから見つかりませんでした。」)
解決方法は以下の通り。
サイズを小さくする方法
Static MFC code bloat problem from VC2010 is now in VC2008 SP1+security fix
https://tedwvc.wordpress.com/2011/04/16/static-mfc-code-bloat-problem-from-vc2010-is-now-in-vc2008-sp1security-fix/
(手順)
- アプリケーションクラスのCWinAppExをCWinAppに置換する(3カ所)。 これは、MS11-025問題以前から、サイズを小さくするために有効な方法であった。 ただし、CWinAppExクラスのメンバ関数を使用しない場合に限る
- 上記URLのソースを、stdafx.cppにコピペする
- リビルド
参考までに、MFCアプリケーションウィザードにて「ダイアログベース」「スタティックライブラリでMFCを使用する」を設定する以外はデフォルトの状態でReleaseビルドした場合、 1702KByte→374KByteまで小さくなる(当方環境による実測値)。
Windows2000対応にする方法
Fixing problems with FindActCtxSectionString in MFC security updates
https://tedwvc.wordpress.com/2011/04/16/fixing-problems-with-findactctxsectionstring-in-mfc-security-updates/
(手順)
- 上記URLのソースを、stdafx.cppにコピペする
- リビルド
サイズの件とWindows2000の件は、個別でも両方同時でも実施可能である。
(メモ)
- MSのお勧めは「共有DLLでMFCを使う」「Windows2000はサポート終了」であることは言うまでもない(いや、MFCを使わずに.NET Frameworkをお勧めか)
- でも、実行ファイル1本で配布できるスタティックビルドは便利なので、プロジェクトの要件やメリット/デメリットを各自判断の上にて実施すること