C++/CLIでExcel.netを遠隔操作した際にExcelのプロセスが終了せず、少々嵌ってしまいました。
コードは以下の通り。
// sheetは既にopen済 System::Object^ cells = this->_excel->GetType()->InvokeMember("Cells", System::Reflection::BindingFlags::GetProperty, nullptr, sheet, nullptr); if(cells != nullptr) { this->_excel->GetType()->InvokeMember("Item", System::Reflection::BindingFlags::SetProperty, nullptr, cells, gcnew array<System::Object^> {row, col, gcnew System::String(v)}); System::Runtime::InteropServices::Marshal::ReleaseComObject(cells); } // sheetをclose and release
Comオブジェクトを解放しているのに何故でしょうか…。
どうやらExcel側で暗黙のオブジェクトが生成されているようです。
おそらくItemオブジェクトが暗黙に生成され、この暗黙オブジェクトに対し値が代入されているようです。
この暗黙オブジェクトの参照カウンタが減らないのでExcelを解放できないのでしょう。
以下のように暗黙オブジェクトが生成されないようにすることでExcelプロセスが終了するようになりました。
// sheetは既にopen済 System::Object^ cells = this->_excel->GetType()->InvokeMember("Cells", System::Reflection::BindingFlags::GetProperty, nullptr, sheet, nullptr); if(cells != nullptr) { System::Object^ cell = this->_excel->GetType()->InvokeMember("Item", System::Reflection::BindingFlags::GetProperty, nullptr, cells, gcnew array<System::Object^> {row, col}); if(cell != nullptr) { this->_excel->GetType()->InvokeMember("Value2", System::Reflection::BindingFlags::SetProperty, nullptr, cell, gcnew array<System::Object^> {gcnew System::String(v)}); System::Runtime::InteropServices::Marshal::ReleaseComObject(cell); } System::Runtime::InteropServices::Marshal::ReleaseComObject(cells); } // sheetをclose and release