본 자료는 devpia에 있던 자료를 기반으로 예전에 작성했던 글이다.
출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=915075&ref=915075
그러나, 해당 페이지는 열리지 않는다. 하지만 같은 문제로 고민하시는 독자가 있을 것으로 생각되어 기록을 남긴다. 필자는 출처에서 언급된 문제로 검색을 하다 가장 원인에 가까운 이유를 발견하였다.
결론은 COM 객체를 잘~ 해제하지 않아서...이다라고 필자도 생각한다.
소스를 살펴보면 OpenExcelFile 함수에서 VARIANTARG 형의 varg1 이 해제되지 않는것을 발견하였고, 해당 함수의 끝에
ReleaseVariant(&varg1);를 추가하여 해결한다.
BOOL CXLAutomation::OpenExcelFile(CString szFileName)
{
//Leave if the file cannot be open
if(NULL == m_pdispExcelApp)
return FALSE;
if(szFileName.IsEmpty())
return FALSE;
VARIANTARG varg1, vargWorkbook, vargWorksheet;
ClearAllArgs();
if (!ExlInvoke(m_pdispExcelApp, L"Workbooks", &varg1, DISPATCH_PROPERTYGET, 0))
return FALSE;
ClearAllArgs();
AddArgumentCString(L"Filename", 0, szFileName);
if (!ExlInvoke(varg1.pdispVal, L"Open", &vargWorkbook, DISPATCH_PROPERTYGET, DISP_FREEARGS))
return FALSE;
//Now let's get the first worksheet of this workbook
ClearAllArgs();
AddArgumentInt2(NULL, 0, 1);
if (!ExlInvoke(vargWorkbook.pdispVal, L"Worksheets", &vargWorksheet, DISPATCH_PROPERTYGET, DISP_FREEARGS))
return FALSE;
//Close the empty worksheet
ClearAllArgs();
if (!ExlInvoke(m_pdispWorkbook, L"Close", NULL, DISPATCH_PROPERTYGET, DISP_FREEARGS))
return FALSE;
ReleaseVariant(&varg1);
//Remember the newly open worksheet
m_pdispWorkbook = vargWorkbook.pdispVal;
m_pdispWorksheet = vargWorksheet.pdispVal;
return TRUE;
}
GetCellValueCString 함수내의 객체 해제부분을 아래와 같이 처리한다.
ReleaseVariant(&vargRng);
//ReleaseVariant(&vargValue); // --> 해당셀에 값이 없을경우 문제가 발생하게 되므로 주석처리한다.
excel.exe 프로세스는 정상적으로 해제됩니다.
반응형
최근댓글