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

解决方案 »

  1.   

    下面有严重问题哦,内存泄漏:
    _THREAD_DATAS* ptd=new _THREAD_DATAS;//申请了一段空间,当之后无人看管了
    ptd=(_THREAD_DATAS*)pParam;          //上面申请的空间变成了孤儿,指针指向了新的地方
    正常写法为:
            _THREAD_DATAS* ptd=static_cast<_THREAD_DATAS*>(pParam);
      

  2.   

    _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;
    是不是td本身是个临时变量?
    还有,你的代码的确有memory leak的问题。
      

  3.   

    _THREAD_DATAS td;声明成全局或static的.  要不就用new产生