C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: C++/CLI でのExcelの扱い


(過去ログ 46 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■24848 / inTopicNo.1)  C++/CLI でのExcelの扱い
  
□投稿者/ 雲 (9回)-(2008/09/11(Thu) 06:16:16)

分類:[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クラスのメンバがインデクサでアクセスできるとはわからないので、文句を言うのは
わかるのですが、何か、良い抜け道は無いかと悩んでいます。

なんとかなるものでしょうか?

引用返信 編集キー/
■24849 / inTopicNo.2)  Re[1]: C++/CLI でのExcelの扱い
□投稿者/ かずき (25回)-(2008/09/11(Thu) 09:35:42)
genericじゃなくてtemplateを使うとどうですか?
引用返信 編集キー/
■24987 / inTopicNo.3)  Re[2]: C++/CLI でのExcelの扱い
□投稿者/ 雲 (10回)-(2008/09/13(Sat) 06:33:02)
> genericじゃなくてtemplateを使うとどうですか?

遅くなってしまいました。

マネージクラスに、template を指定して良いのは初めて知りましたが、
これをすると、ファイナライザのところで、コンパイラに怒られてしまいます。
なかなか、難しいですね。

OM を上手に扱うためのクラスって、どこかに無いのかなぁ。。。なんてことを
思っています。

とはいえ、今のところ、うまい方法が思いつかないので、とりあえず、以下のような
クラスを作ってみました。問題がありそうな処理について、ご指摘頂けると幸いです。
(似たようなクラスは、きっと、どこかにありそうですけど)

public ref class UExcel{
public:
UExcel();
~UExcel();
!UExcel();
property Excel::Worksheet^ default[int]{
Excel::Worksheet^ get( int i );
}

property bool Visible{
void set( bool b );
}

private:
Excel::Application ^excel_;
Excel::Workbooks ^workbooks_;
Excel::Workbook ^workbook_;
Excel::Sheets ^worksheets_;
Excel::Worksheet ^worksheet_;
};


UExcel::UExcel()
{
excel_ = gcnew Excel::Application();
workbooks_ = excel_->Workbooks;
workbook_ = workbooks_->Add( System::Reflection::Missing::Value );
worksheets_ = workbook_->Worksheets;
worksheet_ = nullptr;
}


UExcel::~UExcel()
{
this->!UExcel();
}

UExcel::!UExcel()
{
if( excel_ != nullptr ){
excel_->Quit();
}

if( worksheet_ != nullptr ){
System::Runtime::InteropServices::Marshal::ReleaseComObject( worksheet_ );
}

if( worksheets_ != nullptr ){
System::Runtime::InteropServices::Marshal::ReleaseComObject( worksheets_ );
}

if( workbook_ != nullptr ){
System::Runtime::InteropServices::Marshal::ReleaseComObject( workbook_ );
}

if( workbooks_ != nullptr ){
System::Runtime::InteropServices::Marshal::ReleaseComObject( workbooks_ );
}

if( excel_ != nullptr ){
System::Runtime::InteropServices::Marshal::ReleaseComObject( excel_ );
}
};


Excel::Worksheet^ UExcel::default::get( int i )
{
worksheet_ = (Excel::Worksheet^)worksheets_[i];

return( worksheet_ );
}


void UExcel::Visible::set( bool b )
{
excel_->Visible = b;
}



引用返信 編集キー/
■24996 / inTopicNo.4)  Re[3]: C++/CLI でのExcelの扱い
□投稿者/ 渋木宏明(ひどり) (879回)-(2008/09/13(Sat) 11:47:54)
渋木宏明(ひどり) さんの Web サイト
> OM を上手に扱うためのクラスって、どこかに無いのかなぁ。。。なんてことを
> 思っています。

COM ね。

アンマネージになるけど、_com_ptr や #import を使うのがイチバンです。

どーしてもマネージで、ってことなら com::ptr を使うとか。

引用返信 編集キー/
■24997 / inTopicNo.5)  Re[4]: C++/CLI でのExcelの扱い
□投稿者/ おてやわらか (13回)-(2008/09/13(Sat) 11:51:41)
How to use Managed C++ to Automate Excel
http://www.codeproject.com/KB/office/ExcelwithMC.aspx

Use Visual Studio 2008 C++/CLI to Automate Excel
http://www.codeproject.com/KB/office/automate_excel.aspx

参考になるかどうか、解りませんが、SQL関係の資料を探して
いる時にたまたま出てきました。
引用返信 編集キー/
■25041 / inTopicNo.6)  Re[5]: C++/CLI でのExcelの扱い
□投稿者/ 雲 (11回)-(2008/09/14(Sun) 14:27:47)
>アンマネージになるけど、_com_ptr や #import を使うのがイチバンです。

なるほど。そうですか。。。

>どーしてもマネージで、ってことなら com::ptr を使うとか。

ここですね。
http://www.users.gr.jp/blogs/hidori/archive/tags/C_2B002B002F00_CLI/default.aspx

これについては、ちょっと調べていますが、COM の知識が不足しているので、ちょっと、
時間がかかりそうです。また、わからないところがあったら質問をさせてください。

>参考になるかどうか、解りませんが、SQL関係の資料を探して
>る時にたまたま出てきました。

ありがとうございます。これを参考にクラスを更新した時には、アップするように
します。

とりあえず、今回は、これで解決とします。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -