C++ - COM-объект, который был отделен от базового RCW, не может быть использован

Моя проблема - сообщение об ошибке в заголовке:

COM object that has been separated from its underlying RCW cannot be used.

Я пытался Google, но я мог найти только решения, связанные с деструкторами / освобождение объектов. Это не то, что я хочу сделать.

Во-первых, вот мой код:

String^ filename="c:\\wb.xlsx";
Microsoft::Office::Interop::Excel::Application^ exApp= gcnew Microsoft::Office::Interop::Excel::ApplicationClass();
exApp->Visible=false;
exApp->Workbooks->Open(filename, 2, true, Type::Missing, Type::Missing, Type::Missing, true, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing, Type::Missing);
Worksheet^  exWss;
for (int x = 0; x <= checkedListBox1->CheckedItems->Count - 1; x++){
    for (int p=0; p<checkedListBox1->Items->Count; p++){
        if (checkedListBox1->CheckedItems[x]->ToString()->Equals(checkedListBox1->Items[p]->ToString())){
            p++;
            exWss  = safe_cast<Worksheet^> (exApp->ActiveWorkbook->Sheets[p]);
        }
    }
}

Короче говоря: у меня есть флажок контрольного списка, эта часть кода запускается, когда были выбраны необходимые вещи. В проверенном списке перечислены различные листы книги Excel. Я пытаюсь выбрать лист из рабочей книги в соответствии с выбранным элементом в поле флажка.

В последней строке кода (exWss = safe_cast (exApp->ActiveWorkbook->Sheets[p]);) я получаю упомянутое сообщение об ошибке.

Я видел, что освобождение маршала может вызвать такие проблемы. В другой функции, хотя я запускаю Marshal.Releasecomobject, но он полностью отделен, и я получаю ту же ошибку и без него.

Любые идеи были бы хорошы.

1 ответ

Решение

По какой-то причине кажется, что блок for полностью отделяет объект Interop от остальной части кода. Мне удалось решить эту проблему, инициализировав объект Interop в блоке for. (Я ввел переменную bool, указывающую, была ли книга уже открыта - если она ложна, она открывается в блоке 'for' - в противном случае она продолжается)

Интересно, однако, что объект доступен из блока for без проблем. Я уверен, что этому есть объяснение, которого я не знаю - я новичок, только программист хобби.

Другие вопросы по тегам