MS11-025(KB2465361)問題の対処方法

Visual C++プログラミングのメモ

【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/

(手順)

  1. アプリケーションクラスのCWinAppExをCWinAppに置換する(3カ所)。 これは、MS11-025問題以前から、サイズを小さくするために有効な方法であった。 ただし、CWinAppExクラスのメンバ関数を使用しない場合に限る
  2. 上記URLのソースを、stdafx.cppにコピペする
  3. リビルド

 参考までに、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/

(手順)

  1. 上記URLのソースを、stdafx.cppにコピペする
  2. リビルド

 サイズの件とWindows2000の件は、個別でも両方同時でも実施可能である。

(メモ)

  • MSのお勧めは「共有DLLでMFCを使う」「Windows2000はサポート終了」であることは言うまでもない(いや、MFCを使わずに.NET Frameworkをお勧めか)
  • でも、実行ファイル1本で配布できるスタティックビルドは便利なので、プロジェクトの要件やメリット/デメリットを各自判断の上にて実施すること