Visual Studio(Visual C++) 2012でatlcore.h(35): fatal error C1189 が発生

最近利用し始めた Visual Studio 2012のVisual C++で古いプログラムをコンパイルしてみたところ、atlcore.h でfatal error C1189が発生した。


1>------ すべてのリビルド開始: プロジェクト: myprogram, 構成: Debug Win32 ------
1>  stdafx.cpp
1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\atlcore.h(35): fatal error C1189: #error :  This file requires _WIN32_WINNT to be #defined at least to 0x0403. Value 0x0501 or higher is recommended.
========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ==========

このプログラムは10年位上前に作成したもので、単に定義値を変更して、再コンパイルするだけなんだが、さすがに古すぎるのかもしれない。
stdafx.h の_WIN32_WINNTは0x0400だ。

// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。

#pragma once

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN       // Windows ヘッダーから使用されていない部分を除外します。
#endif

// 下で指定された定義の前に対象プラットフォームを指定しなければならない場合、以下の定義を変更してください。
// 異なるプラットフォームに対応する値に関する最新情報については、MSDN を参照してください。
#ifndef WINVER             // Windows 95 および Windows NT 4 以降のバージョンに固有の機能の使用を許可します。
#define WINVER 0x0400      // これを Windows 98 および Windows 2000 またはそれ以降のバージョン向けに適切な値に変更してください。
#endif

#ifndef _WIN32_WINNT       // Windows NT 4 以降のバージョンに固有の機能の使用を許可します。
#define _WIN32_WINNT 0x0400        // これを Windows 98 および Windows 2000 またはそれ以降のバージョン向けに適切な値に変更してください。
#endif                     

#ifndef _WIN32_WINDOWS     // Windows 98 以降のバージョンに固有の機能の使用を許可します。
#define _WIN32_WINDOWS 0x0410 // これを Windows Me またはそれ以降のバージョン向けに適切な値に変更してください。
#endif

#ifndef _WIN32_IE          // IE 4.0 以降のバージョンに固有の機能の使用を許可します。
#define _WIN32_IE 0x0400   // これを IE 5.0  またはそれ以降のバージョン向けに適切な値に変更してください。
#endif

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 一部の CString コンストラクタは明示的です。

// 一般的で無視しても安全な MFC の警告メッセージの一部の非表示を解除します。
#define _AFX_ALL_WARNINGS

#include <afxwin.h>         // MFC のコアおよび標準コンポーネント
#include <afxext.h>         // MFC の拡張部分

#include <afxdtctl.h>        // MFC の Internet Explorer 4 コモン コントロール サポート
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>          // MFC の Windows コモン コントロール サポート
#endif // _AFX_NO_AFXCMN_SUPPORT

MSDNの情報を見ると、すでにに0x0400が記載されていない!

Using the Windows Headers - Win32 apps | Microsoft Docs

エラーのご指摘通り_WIN32_WINNT を変更して再コンパイル。

#ifndef _WIN32_WINNT       
#define _WIN32_WINNT 0x0501    
#endif 

またエラーが発生する。

1>------ ビルド開始: プロジェクト: html2bmp, 構成: Release Win32 ------
1>  stdafx.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxwin.h(4057): error C2061: 構文エラー : 識別子 'PSCROLLBARINFO'
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxwin2.inl(362): error C2039: 'NotifyWinEvent' : '`global namespace'' のメンバーではありません。
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxwin2.inl(362): error C2660: 'CWnd::NotifyWinEvent' : 関数に 4 個の引数を指定できません。
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxwin4.inl(184): error C2065: 'PSCROLLBARINFO' : 定義されていない識別子です。
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxwin4.inl(184): error C2146: 構文エラー : ')' が、識別子 'pScrollInfo' の前に必要です。
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxwin4.inl(184): error C2761: 'BOOL CScrollBar::GetScrollBarInfo(void) const' : メンバー関数の再宣言はできません。
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxwin4.inl(184): error C2059: 構文エラー : ')'
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxwin4.inl(185): error C2143: 構文エラー : ';' が '{' の前にありません。
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxwin4.inl(185): error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

SCROLLBARINFOも2000以降のサポートのようなので、いっそWINVER _WIN32_WINDOWS _WIN32_IE も変えちゃえということで次の値に変更。


#ifndef WINVER         
#define WINVER 0x0501      
#endif

#ifndef _WIN32_WINNT       
#define _WIN32_WINNT 0x0501    
#endif             

#ifndef _WIN32_WINDOWS     
#define _WIN32_WINDOWS 0x0501 
#endif

#ifndef _WIN32_IE      
#define _WIN32_IE 0x0603   
#endif
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

これで、一応ビルドはできました。