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