在用MFC写了个DLL供PB调用,发现PB下有问题,在VC环境下成功 本帖最后由 my_aa 于 2010-11-02 00:16:11 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 RunPB pParam;这个对象是在运行栈中分配的,在启动线程之后,马上就退出函数 RunPB12 了,pParam 就无效了,导致在线程中访问无效指针;你应该通过 new 或者 malloc 分配 RunPB 大小的内存,然后将指针作为参数传递给线程。 当然有问题, RunPB pParam; 你这个是局部变量,出了函数 RunPB12 就不保证有效了。用内存分配函数分配,或者在RunPB12 里 new ,在线程用完之后 delete/ 用了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;} 不能马上 delete,因为线程 MyThreadProc 很可能还没有执行完成;除了在线程函数中 delete,也可以将指针保存到某个地方,在线程完全退出之后,进行删除。 如何查看VS2010中函数的源代码 感谢党 主窗口、分割窗口的大小 VC自带的Depend.exe,在哪里找啊? 为什么不能安装vc++ 请问 有没有语音分析的库函数 右键菜单???? [急]请教:如何遍历设备的MAC地址 VC++6.0在XP环境下不能进行调试,为什么? 如何使鼠标一直在客户区内 Dependency Walker中的沙漏是什么意思? CEdit派生类响CMyEdit怎么响应OnChange消息
这个对象是在运行栈中分配的,在启动线程之后,马上就退出函数 RunPB12 了,pParam 就无效了,导致在线程中访问无效指针;你应该通过 new 或者 malloc 分配 RunPB 大小的内存,然后将指针作为参数传递给线程。
{
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;
}