本帖最后由 my_aa 于 2010-11-02 00:16:11 编辑

解决方案 »

  1.   

    RunPB pParam;
    这个对象是在运行栈中分配的,在启动线程之后,马上就退出函数 RunPB12 了,pParam 就无效了,导致在线程中访问无效指针;你应该通过 new 或者 malloc 分配 RunPB 大小的内存,然后将指针作为参数传递给线程。
      

  2.   

    当然有问题,   RunPB pParam;  你这个是局部变量,出了函数 RunPB12 就不保证有效了。用内存分配函数分配,或者在RunPB12 里 new ,在线程用完之后 delete/
      

  3.   

     用了new后在MyThreadProc函数成功,可是delete只能在MyThreadProc函数中写吗?extern "C" BOOL PASCAL EXPORT RunPB12(LPTSTR path,DWORD dwMilliseconds)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    PRunPB pParam = NULL;
    pParam = new RunPB();
    CString tmp=CString(path);
    pParam->dwMilliseconds = 23;//dwMilliseconds;
    int iLen = tmp.GetLength();
    pParam->length=iLen;
    StrCpy(pParam->path,(LPCTSTR)tmp);
    AfxMessageBox(pParam->path);
    CWinThread *pThread = AfxBeginThread((AFX_THREADPROC)MyThreadProc,(LPVOID)pParam,NULL);
    //delete pParam;/*在这里delete就会有问题,难道只能在MyThreadProc中delete?*/
    return TRUE;
    }
      

  4.   

    不能马上 delete,因为线程 MyThreadProc 很可能还没有执行完成;除了在线程函数中 delete,也可以将指针保存到某个地方,在线程完全退出之后,进行删除。