|
分類:[C++/CLI]
こんにちは。
最近、C++/CLI で Excel を使おうとしています。 Excel の COM を使うので、解放処理を正しく実装するのが 面倒そうだったので、試しに、クラスを作ってみました。
※といっても、おもちゃみたいなものですが。。。 (クラス名は、適当です)
generic <typename T> public ref class ABC{ public: ABC(){} ABC( T% com_obj ) : com_obj_( com_obj ){} ~ABC(){ this->!ABC(); }; !ABC(){ System::Runtime::InteropServices::Marshal::ReleaseComObject( com_obj_ ); };
T operator->(){ return( com_obj_ ); } property T default[int]{ ← (△)ここでコンパイルエラーが出ます。 T get( int i ){ return( com_obj_[i] ); } } T com_obj_; };
使い方としては、
ABC<Excel::Application^> ^excel = gcnew ABC<Excel::Application^>( gcnew Excel::Application() ); ABC<Excel::Workbooks^> ^workbooks = gcnew ABC<Excel::Workbooks^>( excel->Workbooks ); ABC<Excel::Workbook^> ^workbook = gcnew ABC<Excel::Workbook^>( workbooks->Add(System::Reflection::Missing::Value) ); ABC<Excel::Sheets^> ^worksheets = gcnew ABC<Excel::Sheets^>( workbook->Worksheets ); ABC<Excel::Worksheet^> ^worksheet = gcnew ABC<Excel::Worksheet^>( (Excel::Worksheet^)worksheets[1] ); ← これをやりたい。
こんな感じで使いたいのですが、最後の worksheet のオブジェクトを生成する時に、worksheets[1] としたいのに、 ABC のクラスの定義(△)に入れるとコンパイルエラーとなってしまいます。
まぁ、コンパイラから見ると、ABCクラスのメンバがインデクサでアクセスできるとはわからないので、文句を言うのは わかるのですが、何か、良い抜け道は無いかと悩んでいます。
なんとかなるものでしょうか?
|