• 締切済み

#import文とC2011エラーの回避方法

VC++2003にてCOM/ATL属性つきプログラミングをしております。 前々から気にはなっていたのですが、今回本格的に何とかしたいので 質問させていただきます。OSはXPSP3です。 自家製のライブラリを用途の分類ごとにCOMモジュール(DLL)で分けて作っています。 一番基本的なライブラリモジュールで enum emTestType { ttType1, ttType2 }; などという列挙値があり、COMクラスでプロパティ値として使用しています。 __interface TestObject : public IUnknown { [propput] HRESULT TestType([in] emTestType newVal); [propget] HRESULT TestType([out,retval] emTestType* pVal); }; このモジュールをTEST1.dllとしたとき、ほかのモジュールで二次使用するときに TEST2.dll stdafx.h #import "libid:..............." no_namespace named_guids [import(C:\...\TEST1.idl)]; とインポートしていますが、さらにこのモジュール内のオブジェクトで TEST2.h __interface EditObject : public IUnknown { [propput] HRESULT TestType([in] emTestType newVal); [propget] HRESULT TestType([out,retval] emTestType* pVal); }; とenum値を使いまわしています。そしてさらにもうひとつのモジュールでも TEST3.dll stdafx.h #import "libid:..............." no_namespace named_guids [import(C:\...\TEST1.idl)]; TEST3.h __interface ViewObject : public IUnknown { [propput] HRESULT TestType([in] emTestType newVal); [propget] HRESULT TestType([out,retval] emTestType* pVal); }; と使いまわしていて、さらに四つ目のモジュールで TEST4.dll stdafx.h #import "libid:..............." no_namespace named_guids [import(C:\...\TEST1.idl)]; #import "libid:..............." no_namespace named_guids [import(C:\...\TEST2.idl)]; #import "libid:..............." no_namespace named_guids [import(C:\...\TEST3.idl)]; と三次使用したいのですが、このときにC2011エラー(型の再定義)が発生します。 使いまわしたいから基本モジュールに入れているのですが、、、(;_;) 今までは二次使用から型を使わずにULONG値にしてしまっていました。 これはenum型に限らずクラス型でも当然起こります。 私は、これは#import文の引数で何とかなるんじゃないの?と思っているのですが、どうなんでしょうか。 あるいはもっと根本的な治療法があるのでしょうか? よろしくご教授お願いします。

みんなの回答

回答No.2

ああ、ごめんなさい、comでしたね。 IDL内に定義してください。 コンパイラが吐き出すヘッダ(.cかも)に定義したものが書き出されますので。

v_isao_v
質問者

お礼

わかりました!! その後ネットで調べたところ、やはり#importに値を設定することで回避できました 具体的には、C2011エラーが出るモジュールのインポート時に #import "libid:......." no_namespace named_guids \ exclude("emTestType") <<--------------------- ココ を追加することで再定義を回避できました。 ありがとうございました。

回答No.1

enumをtypedef enumにしてヘッダに置けばよくないですか? 私はenumとして宣言全くしない派で、 常にtypedefをつけて定義型にしています。

v_isao_v
質問者

お礼

ご回答ありがとうございます。 ウーン、結構な無精者でして ヘッダを分離してそれなりの共通フォルダを作って, , , って感じですよね importで自動で出来上がるファイルが結構性能も良いんで重宝してるんです。 それにこれだとタイプライブラリには定義が表現されませんよね。 COMなんでそれもちょっと。ゴメンナサイ。 あれ、でも定義型なんて今まで気にしたことも無かった そういえばシステムの定義(たとえばRECT型)なんかは自動的に除外し・・・ なんて出てくるので不思議に思ってたんですがこれのことなんでしょうか 少し調べてやってみます。 取り急ぎのお礼なんですが申し訳ありません。ありがとうございました。

v_isao_v
質問者

補足

やってみました。 ちょっと難しいようです。 まず enum 型名 {}; を typedef enum タグ名 {} 型名; にしましたところenum用の属性が付けられなくなりました。 なので属性をコメントアウトしたところプロパティで使用している部分が IDLのコンパイル中にシンタックスエラーとなりました。 残念です。どこか間違っているのでしょうか。 それにしても、システムの定義で、自動的に除外し、なんてのがまさに 私のやりたいことなんです。ものすごく近づいたような気はしました。 ありがとうございました。

関連するQ&A