我大体采用以下代码生成报表,但有时生成报表时出现程序死报表出不来,查看任务管理器发现windoes任务进程中有“excel.exe",如何解决报表偶尔生成不了和杀死excel.exe进程?以下为代码。谢谢!
 #include   "comdef.h"     
  #include   "Excel9.h"     
  在void   CExcelTestDlg::OnExceltest()   函数中增加如下代码:     
  void   CExcelTestDlg::OnExceltest()       
  {     
  _Application   ExcelApp;     
  Workbooks   wbsMyBooks;     
  _Workbook   wbMyBook;     
  Worksheets   wssMysheets;     
  _Worksheet   wsMysheet;     
  Range   rgMyRge;     
  //创建Excel   2000服务器(启动Excel)     
      
  if   (!ExcelApp.CreateDispatch("Excel.Application",NULL))     
  {     
  AfxMessageBox("创建Excel服务失败!");     
  exit(1);     
  }     
  //利用模板文件建立新文档     
  wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);     
  wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t("g:\\exceltest\\MyTemplate.xlt")));     
  //得到Worksheets     
  wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true);     
  //得到sheet1     
  wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true);     
  //得到全部Cells,此时,rgMyRge是cells的集合     
  rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);     
  //设置1行1列的单元的值     
  rgMyRge.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("This   Is   A   Excel   Test   Program!"));     
  //得到所有的列     
  rgMyRge.AttachDispatch(wsMysheet.GetColumns(),true);     
  //得到第一列     
  rgMyRge.AttachDispatch(rgMyRge.GetItem(_variant_t((long)1),vtMissing).pdispVal,true);     
  //设置列宽     
  rgMyRge.SetColumnWidth(_variant_t((long)200));     
  //调用模板中预先存放的宏     
  ExcelApp.Run(_variant_t("CopyRow"),_variant_t((long)10),vtMissing,vtMissing,     
  vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,     
  vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,     
  vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,     
  vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing);     
  //打印预览     
  wbMyBook.SetSaved(true);     
  ExcelApp.SetVisible(true);     
  wbMyBook.PrintPreview(_variant_t(false));     
  //释放对象     
  rgMyRge.ReleaseDispatch();     
  wsMysheet.ReleaseDispatch();     
  wssMysheets.ReleaseDispatch();     
  wbMyBook.ReleaseDispatch();     
  wbsMyBooks.ReleaseDispatch();     
  ExcelApp.ReleaseDispatch();     
  }      

解决方案 »

  1.   

    下面这段代码可以终止指定名称的进程。
    将这个函数添加到某个类中,调用它结束你要的进程,其中参数a就是进程名。int killpro(CString a)
    {
    PROCESSENTRY32 pe32;
    pe32.dwSize =sizeof(pe32);
    HANDLE hpro=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    return 0;
    if(hpro==INVALID_HANDLE_VALUE)

    return 0;
    }
    BOOL nowrun=Process32First(hpro,&pe32);
    while(nowrun)
    {
    if(pe32.szExeFile ==a)
    {
    DWORD proid=pe32.th32ProcessID;
    HANDLE hprocess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,proid);
    if(hprocess!=NULL)
    {
    ::TerminateProcess(hprocess,0);
    ::CloseHandle(hprocess);
    }
    }
    nowrun=::Process32Next(hpro,&pe32);
    }
    }如果你要终止excel.exe,只需要带参数调用killpro("EXCEL.EXE")就可以了。
      

  2.   

    有没用不通过杀死EXCEl进程,来解决报表出不来程序死的问题?
      

  3.   

    不要强行杀死进程
    应该是没有推出excel或者说退的不干净
    你自己检查一下是不是干释放的东西都释放干净了
      

  4.   

    CSDN搞什么啊最近,虽然改版改的图标好看了,可是登录以后总是未登录的状态,读得分的回复都读不了