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

Visual Studio
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だ。

cpp
// 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_WINNT を変更して再コンパイル。

Visual Studio
#ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif

またエラーが発生する。

Visual Studio
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 も変えちゃえということで次の値に変更。

cpp
#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
Visual Studio
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

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