桜、抹茶、白、日記

名古屋市在住のC++使いのcoderの日記だったもの。

VisualStudioのリソースコンパイラについて

VisualC++ 2010で作成したMFCプロジェクトを、VisualC++ 2008でプロジェクトファイルだけ作って共用できるようにすると、ビルドエラーになっちゃいます。

// Microsoft Visual C++ で生成されたリソース スクリプトです。
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE 2 リソースから生成されました。
//
#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#include "afxres.h"
#include "verrsrc.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE
BEGIN
    "#ifndef APSTUDIO_INVOKED\r\n"
    "#include ""targetver.h""\r\n"
    "#endif\r\n"
    "#include ""afxres.h""\r\n"
    "#include ""verrsrc.h""\r\n"
    "\0"
END

3 TEXTINCLUDE
BEGIN
    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
    "#define _AFX_NO_OLE_RESOURCES\r\n"
    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
    "\r\n"
    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)\r\n"
    "LANGUAGE 17, 1\r\n"    
    "#include ""res\\MFCApplication2.rc2""  // Microsoft Visual C++ 以外で編集されたリソース\r\n"
    "#include ""l.JPN\\afxres.rc""      // 標準コンポーネント\r\n"
    "#if !defined(_AFXDLL)\r\n"
    "#include  ""l.JPN\\afxribbon.rc""   // MFC リボンおよびコントロール バー リソース\r\n"
    "#endif\r\n"
    "#endif\r\n"
    "\0"
END

/////////////////////////////////////////////////////////////////////////////
#endif    // APSTUDIO_INVOKED

CPPファイルやヘッダーはビルド通るのですが、リソースファイルの「#include "verrsrc.h"」でビルドエラーになります。VisualC++ 2008にはそんなヘッダーファイルないんですね。

#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#include "afxres.h"
#if 1600 <= _MSC_VER // VS2010以降の場合にインクルードする
#include "verrsrc.h"
#endif

そんでこんなコードを書いて満足していたんですが、これバグっているんですね。VisualC++ 2010でコンパイルした場合にも「#include "verrsrc.h"」は無効化されたままです。リソースコンパイラ(rc.exe)さんは「_MSC_VER」マクロは定義してくれません。
MFCだから「_MFC_VER」ならいけるんでは?と思いきや、これも「_MFC_VER」が定義されたヘッダーが読み込まれないので使えません。

#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#include "afxres.h"
#ifndef USE_LEGACY_COMPILER // 「verrsrc.h」がない環境ではプロジェクト設定で「USE_LEGACY_COMPILER」を定義する
#include "verrsrc.h"
#endif

結局、VisualC++ 2008のプロジェクトのリソース設定で「USE_LEGACY_COMPILER=1」って入れて対処しました。
あと大事なことですが、リソースファイル(*.rc)の「TEXTINCLUDE」の部分はリソースを編集した際のエクスポート処理で使われるので、「TEXTINCLUDE」部分のインクルード構文も編集しておく必要があります。