none
MS提供のライブラリがコンパイルエラー RRS feed

  • 質問

  • Visual Studio6.0からVisual Studio2015に移行の際に_ATL_ATTRIBUTESを設定してコンパイルをするとC2504 'CRecord': 定義されていない基底クラスが宣言されています。 とエラーになり_ATL_ATTRIBUTESをはずしてコンパイルすると<atlcom.h>内でエラーが発生してしまいます。
    2016年7月28日 10:12

回答

  • C:\Program Files\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcom.h(2903): error C2504: 'CRecord': 定義されていない基底クラスが宣言されています。

    これはエラーの直接の原因ですが、次の行にエラーを引き起こした真の原因が書かれています。

    問題となっている行は

    template <class Base>   ←この行
    class CComObject : 
    	public Base
    {

    です。どこかでCComObject<CRecord>型が使われているものの、当該行時点でCRecordが定義されていないことが原因です。

    というわけで、「エラーリスト」ウィンドウではなく「出力」ウィンドウでエラー内容をよく確認してください。

    • 回答としてマーク 小西 德 2016年7月29日 4:59
    2016年7月29日 4:30

すべての返信

  • その「CRecord」とやらは自前の実装ではないでしょうか。
    C2504が意味するのは、そのCRecordの派生元のクラスの定義がみつからなかったわけなので、
    そのクラスの名称を明記したほうが良いかもしれません。
    さて一般に、そのようなことになるのは、

    1.その派生元のクラスが定義宣言されているヘッダーがインクルードされていない。
    2.又は何らかのプリプロセスにより無効化されている。

    等が考えられます。
    できるのなら、C2504が発生する前後をコピペしてみてはどうでしょう。

    または、#define _ATL_ATTRIBUTESしている部分の近傍の
    インクルードに問題があるのかもしれません。特に順位かもしれません。
    一般に次のような感じかと思うのですが、どうでしょう。
    #define _ATL_ATTRIBUTES
    #include <atlbase.h>
       :

    2016年7月28日 11:02
  • 返信ありがとうございます。

    そして、情報不足で申し訳ございません。

    #define _ATL_ATTRIBUTES
    #include <atlbase.h>

    #include <atlcom.h>はstdafx.hで宣言しており、CRecord のC2504はatlcom.h内で発生おります。

    2016年7月29日 0:13
  • ざっくりgrepしてみましたが、atlcom.hにはCRecordの文字列は見つからなかったです。

    また、提示されたコードをそのまま食わせましたが、「ATL属性は非推奨」と言われただけでしたし、_ATL_ATTRIBUTESのdefineをはがしても、atlcom.hでエラーが出る、ということもなかったです。

    とりあえず、行数が知りたいので、コンパイラの吐いたエラーを全行そのまま貼り付けてもらえませんかね。あとは、プロジェクト側で定義されている#define項目とかも。


    jzkey

    2016年7月29日 0:31
  • 前提条件を整理してみます。

     1.VC++6.0時代 のATL COM関連コードをVS2015にポーティングしようと試みている。
     2.C2504がclass CRecordで発生した。
     3.ATLはtemplateを使用している。
     4.templateは、VC++6.0時代と現在のVSとは仕様が一部異なっている。
     5.同様にC++言語の仕様自体も一部異なっている

    なので、VC++6.0時代のコードを最近のVSでコンパイルすると、エラーが出るのが当たり前なわけです。
    その作業は比較的高度な知識と経験が必要な試みであるということですね。しかも

     6.CRecordと言う名前のクラスはVC++6.0時代のMS提供のCOM関連のコードセットには含まれてない。
     7.つまり「MS提供ののライブラリがコンパイルエラー」という認識は誤りである。

    と考えられるわけです。以上を勘案すると、

     8.発生しているエラーの省略されていない内容の提示が必要。
     9.当該のCRecordのコードの提示が必要(特に定義宣言部分)。

    となるわけなのですが、いかがでしょう。

    2016年7月29日 1:56
  • 返信ありがとうございます。

    申し訳ございません。

    知識・経験不足のためご教授をお願いしております。

    回答いたします。

     8.発生しているエラーの省略されていない内容の提示が必要。

    C:\Program Files\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcom.h(2903): error C2504: 'CRecord': 定義されていない基底クラスが宣言されています。

    コンパイルエラーは上記のように出力されました。

     9.当該のCRecordのコードの提示が必要(特に定義宣言部分)。

    申し訳ございません。CRecordのコードとはこちらでよろしいのでしょうか

    [
     coclass,
     threading("apartment"),
     support_error_info("IPPFE_ApplySheet"),
     uuid("58DB05E5-EE38-4FD2-BC83-4E78D9E352F6"),
     noncreatable,
     registration_script("none")
    ]
    class ATL_NO_VTABLE CApplySheet :
     public IDispatchImpl<IPPFE_ApplySheet>
    {
    public:
     CApplySheet() { m_pvForeImage = NULL; m_pvBackImage = NULL; }


     DECLARE_PROTECT_FINAL_CONSTRUCT()

     HRESULT FinalConstruct() { return S_OK; }
     
     void FinalRelease();

     void SetApplySheetInfo(LPCWSTR pszName, const CApplySheetElement& element)
      { m_strName = pszName; m_element = element; }

    2016年7月29日 4:17
  • 返信ありがとうございます。

    エラーと#define #includeを報告します。

    エラー

    C:\Program Files\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcom.h(2903): error C2504: 'CRecord': 定義されていない基底クラスが宣言されています。

    stdafx.hの宣言部分

    #include <sdkddkver.h>

    #define NO_WARN_MBCS_MFC_DEPRECATION
    #define _CRT_SECURE_NO_WARNINGS
    #define _ATL_ATTRIBUTES

    #ifndef STRICT
    #define STRICT
    #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 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_APARTMENT_THREADED
    #define _ATL_NO_AUTOMATIC_NAMESPACE

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

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

    #include <atlbase.h>
    #include <atlcom.h>
    #include <atlwin.h>
    #include <atltypes.h>
    #include <atlctl.h>
    #include <atlhost.h>

    #include <vector>
    #include <list>
    #include <map>

    using namespace ATL;

    #include <comdef.h>

    #include "msxml2.h"

    知識・経験ともに不足で申し訳ございませんが、ご教授をお願いいたします。

    2016年7月29日 4:20
  • C:\Program Files\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcom.h(2903): error C2504: 'CRecord': 定義されていない基底クラスが宣言されています。

    これはエラーの直接の原因ですが、次の行にエラーを引き起こした真の原因が書かれています。

    問題となっている行は

    template <class Base>   ←この行
    class CComObject : 
    	public Base
    {

    です。どこかでCComObject<CRecord>型が使われているものの、当該行時点でCRecordが定義されていないことが原因です。

    というわけで、「エラーリスト」ウィンドウではなく「出力」ウィンドウでエラー内容をよく確認してください。

    • 回答としてマーク 小西 德 2016年7月29日 4:59
    2016年7月29日 4:30
  • atlcom.h(2903)の部分ですが、ダブルクリックしたりして中身を表示すると、ちゃんとこうなってますか?

    2900 template <class Base> 
    2901 class CComObject : 
    2902	public Base
    2903 {
    2904 public:

    世の中には、標準ヘッダを書き換えるような人もいるので、一応。

    あるいは、続きで他にエラーは出ていませんか?


    jzkey

    2016年7月29日 4:33
  • 返信ありがとうございます。

    おっしゃるとおり、

    エラーを確認したところヘッダー宣言の順序が間違っていたため

    CRecordが宣言される前にCRecordを使用する部分が宣言されていました。

    大変、ご迷惑をお掛けしました。

    ご教授ありがとうございます。

    2016年7月29日 5:02