본 자료는 devpia에 있던 자료를 기반으로 예전에 작성했던 글이다.

     

    출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=915075&ref=915075

     

    그러나, 해당 페이지는 열리지 않는다. 하지만 같은 문제로 고민하시는 독자가 있을 것으로 생각되어 기록을 남긴다. 필자는 출처에서 언급된 문제로 검색을 하다 가장 원인에 가까운 이유를 발견하였다. 

     

      http://no7do.tistory.com/21

     

    결론은 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 프로세스는 정상적으로 해제됩니다.

     

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기