现在有一情况, 在类成员函数中可以操作成功,但是另外启动一线程,再操作就不成功了.
//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;
}请各位大虾指教.
//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;
}请各位大虾指教.
用成员函数实现是等这个函数执行完之后才销毁
CoInitialize(NULL);
AfxEnableControlContainer();
建议使用PostThreadMessage的方式来调用NewExcelFile函数