2012-12-28 147 views
0

내 문제는 제목에 오류 메시지입니다 사용할 수 없습니다C++의 기본 RCW에서 분리 된 COM 개체는

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

내가 그것을 구글 위해 노력했다,하지만 난에 관련된 유일한 해결책을 찾을 수 파괴자/해제 개체. 그것은 내가하고 싶은 것이 아닙니다. 한마디로

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]); 
     } 
    } 
} 

:

먼저, 여기에 내 코드 나는 checkedlistbox이 필요한 물건이 선택되었을 때 코드의이 부분이 실행된다. checkedlistbox에는 Excel 통합 문서의 다른 시트가 나열됩니다. checkedlistbox에서 선택한 항목에 따라 통합 문서에서 시트를 선택하려고합니다.

마지막 코드 줄 (exWss = safe_cast (exApp-> ActiveWorkbook-> Sheets [p]);)에서 언급 한 오류 메시지가 나타납니다.

마샬 해제가 이러한 문제를 일으킬 수 있음을 알았습니다. 다른 함수에서 나는 Marshal.Releasecomobject를 실행하지만 완전히 분리되어 있고, 그것도없이 같은 오류가 발생한다.

모든 아이디어를 얻을 수 있습니다.

답변

0

'for'블록이 Interop 객체를 나머지 코드와 완전히 구분하는 것처럼 보입니다. 필자는 'for'블록 내에서 Interop 객체를 초기화하여 문제를 해결할 수있었습니다. (통합 문서가 이미 열려 있는지 여부를 나타내는 bool 변수를 도입했습니다. - 이것이 틀리면 'for'블록 내에서 열립니다. 그렇지 않으면 계속됩니다.)

흥미롭게도 객체는 'for'블록 문제없이. 나는 그것에 대해 설명 할 것이 틀림 없다, 나는 모르겠다. 나는 초보자이고, 취미 프로그래머 일 뿐이다.