现在有一情况, 在类成员函数中可以操作成功,但是另外启动一线程,再操作就不成功了.
//Operate Excel, 全局变量
_Application excelApp;         
Workbooks    oBooks;
_Workbook    oBook;
Sheets     oSheets;
_Worksheet   oSheet;
Range        rngXls;UINT ID_ThreadCommunicate(LPVOID pParam);   //线程函数.void CIDFrmXDlg::OnOK() 
{
         if(!InitExcel())
    return;
         //NewExcelFile(strXlsFile);      //此函数在此处时可以执行成功.并新建一Excel表格.
if(!m_strFile.IsEmpty())
{
                 g_pThread = AfxBeginThread(ID_ThreadCommunicate,this);
}
}BOOL CIDFrmXDlg::InitExcel()
{
if(!excelApp.CreateDispatch(_T("Excel.Application"),NULL)) 

AfxMessageBox("创建Excel2003失败!"); 
return FALSE; 
}
return TRUE;
}BOOL CIDFrmXDlg::NewExcelFile(CString savePath)
{
         excelApp.SetVisible(FALSE);    //从OnOK()函数中执行时正常, 但从线程中执行这句时会出错: "Unhandled exception in IDFrm.exe   (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception." oBooks=excelApp.GetWorkbooks();
         .....
         .....
         return TRUE;
}UINT ID_ThreadCommunicate(LPVOID pParam)
{
int i;
CIDFrmXDlg* pWnd = (CIDFrmXDlg*)pParam;
         CString strXlsFile = pWnd->m_strXlsFile;         .....
         pWnd->NewExcelFile(strXlsFile);   //函数在此处时执行会出错.
         ....
         return TRUE;
}请各位大虾指教.

解决方案 »

  1.   

    OnOK之后你的对话框创建线程,然后紧接着就销毁了,线程也就没法执行了
    用成员函数实现是等这个函数执行完之后才销毁
      

  2.   

    在线程函数开始位置加上下面两行代码:
    CoInitialize(NULL);
    AfxEnableControlContainer();
      

  3.   

    有些变量是线程相关的,你只能在创建改变量的线程中使用.
    建议使用PostThreadMessage的方式来调用NewExcelFile函数
      

  4.   

    你要在线程里捕捉异常,将NewExcelFile函数里面的代码写在try{ ..... },catch (exception e ) {....} 里面。需要你对异常进行处理。你不