none
关于VC调用EXCEL的_Application后内存不释放的问题 RRS feed

  • 常规讨论

  • 在vc中使用_Application调用excel2003读取相关数据后,关闭excel之后,内存并没有释放,excel进程也没有退出,是怎么回事呢?

    使用excel的代码为:
        _Application  ExcelApp;
        ::CoInitialize(NULL);
        if(!ExcelApp.CreateDispatch(_T("Excel.Application"), NULL))
        {
            ::CoUninitialize();
            return false;
        }
       
        ExcelApp.SetVisible(FALSE);  // 隐藏

        Workbooks    wbsBooks;
        _Workbook    wbBook;
        Worksheets    wssSheets;
        _Worksheet    wsSheet;
        Range        rngXls;
       
        DWORD dwTotalRecord = 0;    //总行数
        int nColumn = 0;            //总列数
       
        wbsBooks.AttachDispatch(ExcelApp.GetWorkbooks());
        wbBook.AttachDispatch(wbsBooks.Add(_variant_t(pCurTask->szSrcFile)));
        wssSheets.AttachDispatch(wbBook.GetWorksheets(), true);    //得到Worksheets
        wsSheet.AttachDispatch(wssSheets.GetItem(_variant_t("Sheet1")), true);    //得到sheet1
           
        //读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列
        Range usedRange;
        usedRange.AttachDispatch(wsSheet.GetUsedRange());
        rngXls.AttachDispatch(usedRange.GetRows());
        dwTotalRecord = rngXls.GetCount(); //已经使用的行数

        rngXls.AttachDispatch(usedRange.GetColumns());
        nColumn = rngXls.GetCount();    //已经使用的列数
        rngXls.AttachDispatch(wsSheet.GetCells(), true);
        _variant_t varTemp = rngXls.GetItem(vRow, vCol);
        。。。。。。


    退出excel的代码为
        wbsBooks.Close();
        ExcelApp.Quit();
        rngXls.ReleaseDispatch();
        wsSheet.ReleaseDispatch();
        wssSheets.ReleaseDispatch();
        wbBook.ReleaseDispatch();
        wbsBooks.ReleaseDispatch();
        ExcelApp.ReleaseDispatch();
        ExcelApp.ReleaseDispatch();

        rngXls = NULL;
        wsSheet = NULL;
        wssSheets = NULL;
        wbBook = NULL;
        wbsBooks = NULL;
        ExcelApp = NULL;
        ::CoUninitialize();
    2009年7月20日 8:25

全部回复

  • 在VB中使用_Application调用excel2003读取相关数据后,关闭excel之后,内存并没有释放,excel进程也没有退出,是怎么回事呢?

    使用excel的代码为:
        _Application  ExcelApp;
        ::CoInitialize(NULL);
        if(!ExcelApp.CreateDispatch(_T("Excel.Application"), NULL))
        {
            ::CoUninitialize();
            return false;
        }
       
        ExcelApp.SetVisible(FALSE);  // 隐藏

        Workbooks    wbsBooks;
        _Workbook    wbBook;
        Worksheets    wssSheets;
        _Worksheet    wsSheet;
        Range        rngXls;
       
        DWORD dwTotalRecord = 0;    //总行数
        int nColumn = 0;            //总列数
       
        wbsBooks.AttachDispatch(ExcelApp.GetWorkbooks());
        wbBook.AttachDispatch(wbsBooks.Add(_variant_t(pCurTask->szSrcFile)));
        wssSheets.AttachDispatch(wbBook.GetWorksheets(), true);    //得到Worksheets
        wsSheet.AttachDispatch(wssSheets.GetItem(_variant_t("Sheet1")), true);    //得到sheet1
           
        //读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列
        Range usedRange;
        usedRange.AttachDispatch(wsSheet.GetUsedRange());
        rngXls.AttachDispatch(usedRange.GetRows());
        dwTotalRecord = rngXls.GetCount(); //已经使用的行数

        rngXls.AttachDispatch(usedRange.GetColumns());
        nColumn = rngXls.GetCount();    //已经使用的列数
        rngXls.AttachDispatch(wsSheet.GetCells(), true);
        _variant_t varTemp = rngXls.GetItem(vRow, vCol);
        。。。。。。


    退出excel的代码为
        wbsBooks.Close();
        ExcelApp.Quit();
        rngXls.ReleaseDispatch();
        wsSheet.ReleaseDispatch();
        wssSheets.ReleaseDispatch();
        wbBook.ReleaseDispatch();
        wbsBooks.ReleaseDispatch();
        ExcelApp.ReleaseDispatch();
        ExcelApp.ReleaseDispatch();

        rngXls = NULL;
        wsSheet = NULL;
        wssSheets = NULL;
        wbBook = NULL;
        wbsBooks = NULL;
        ExcelApp = NULL;
        ::CoUninitialize();
    2009年7月20日 8:27