BOOL CExcel::OpenApp()
{
if(m_app) return TRUE;
if(!m_app.CreateDispatch(_T("Excel.Application")))
{
return FALSE;
} //设置m_workbooks;
m_workbooks.AttachDispatch(m_app.GetWorkbooks(),TRUE);
return TRUE;
}//////////////////////////////////////////////////////////////////////
// 线程参数结构
typedef struct
{
LPVOID pParam;
CReportCtrl* pCtrl;
CString sFields;
long nPageType;
HWND hParent;
} _THREAD_DATAS;// 线程
UINT ThreadGetInfo(LPVOID pParam)
{
_THREAD_DATAS* ptd=new _THREAD_DATAS;
ptd=(_THREAD_DATAS*)pParam; AfxOleInit();
CExcel exl; --->到此ptd变量中的数据有时正常,有时错误;
if(!exl.OpenApp())
{
AfxMessageBox("Excel可能没有安装!",MB_OK|MB_ICONINFORMATION);
return 1;
}
// 执行到这里的时候,就是成功启动Excel应用程序的时候线程变量ptd中的数据如果在之前是正常的也变为不可用的数据
exl.ShowApp(0); // 下面是我的处理过程……
……
return 1;
}
郁闷,不知道是什么原因,希望大家帮忙看看是怎么回事例如,我本来传入线程的参数是
_THREAD_DATAS td;
td.pCtrl=&m_lstDataMap;
td.sFields=g_CmdParam.sFields; // g_CmdParam.sFields="姓名|年龄|"
td.hParent=this->m_hWnd; // 有效的句柄
td.pParam=(LPVOID)m_pParam; //
td.nPageType=0;进入线程之后,参数就变成
ptd->g_CmdParam.sFields="";
ptd->m_hWnd; // 不可用
ptd->nPageType=1598249616;
ptd->pParam=(LPVOID)m_pParam; // 0x00000000
{
if(m_app) return TRUE;
if(!m_app.CreateDispatch(_T("Excel.Application")))
{
return FALSE;
} //设置m_workbooks;
m_workbooks.AttachDispatch(m_app.GetWorkbooks(),TRUE);
return TRUE;
}//////////////////////////////////////////////////////////////////////
// 线程参数结构
typedef struct
{
LPVOID pParam;
CReportCtrl* pCtrl;
CString sFields;
long nPageType;
HWND hParent;
} _THREAD_DATAS;// 线程
UINT ThreadGetInfo(LPVOID pParam)
{
_THREAD_DATAS* ptd=new _THREAD_DATAS;
ptd=(_THREAD_DATAS*)pParam; AfxOleInit();
CExcel exl; --->到此ptd变量中的数据有时正常,有时错误;
if(!exl.OpenApp())
{
AfxMessageBox("Excel可能没有安装!",MB_OK|MB_ICONINFORMATION);
return 1;
}
// 执行到这里的时候,就是成功启动Excel应用程序的时候线程变量ptd中的数据如果在之前是正常的也变为不可用的数据
exl.ShowApp(0); // 下面是我的处理过程……
……
return 1;
}
郁闷,不知道是什么原因,希望大家帮忙看看是怎么回事例如,我本来传入线程的参数是
_THREAD_DATAS td;
td.pCtrl=&m_lstDataMap;
td.sFields=g_CmdParam.sFields; // g_CmdParam.sFields="姓名|年龄|"
td.hParent=this->m_hWnd; // 有效的句柄
td.pParam=(LPVOID)m_pParam; //
td.nPageType=0;进入线程之后,参数就变成
ptd->g_CmdParam.sFields="";
ptd->m_hWnd; // 不可用
ptd->nPageType=1598249616;
ptd->pParam=(LPVOID)m_pParam; // 0x00000000
_THREAD_DATAS* ptd=new _THREAD_DATAS;//申请了一段空间,当之后无人看管了
ptd=(_THREAD_DATAS*)pParam; //上面申请的空间变成了孤儿,指针指向了新的地方
正常写法为:
_THREAD_DATAS* ptd=static_cast<_THREAD_DATAS*>(pParam);
td.pCtrl=&m_lstDataMap;
td.sFields=g_CmdParam.sFields; // g_CmdParam.sFields="姓名|年龄|"
td.hParent=this->m_hWnd; // 有效的句柄
td.pParam=(LPVOID)m_pParam; //
td.nPageType=0;
是不是td本身是个临时变量?
还有,你的代码的确有memory leak的问题。