BOOL CUseDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
//在消息里面启动线程
AfxBeginThread(func,(LPVOID)&pCopyDataStruct);
}
UINT func(LPVOID p)
{
COPYDATASTRUCT * cp=(COPYDATASTRUCT *)p;
MessageBox(NULL,(char *)(cp->lpData),"",0);
}运行时候,对话框要么内容为空,要么就报错“内存不能read...."
请问是什么原因?甚至传递的是char * 都不行?
{
//在消息里面启动线程
AfxBeginThread(func,(LPVOID)&pCopyDataStruct);
}
UINT func(LPVOID p)
{
COPYDATASTRUCT * cp=(COPYDATASTRUCT *)p;
MessageBox(NULL,(char *)(cp->lpData),"",0);
}运行时候,对话框要么内容为空,要么就报错“内存不能read...."
请问是什么原因?甚至传递的是char * 都不行?
AfxBeginThread(func,(LPVOID)pCopyDataStruct);
正确的做法如下:
BOOL CUseDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// 首先使用静态变量来保存pCopyDataStruct中的内容
static COPYDATASTRUCT data;
data = *pCopyDataStruct;
//在消息里面启动线程
AfxBeginThread(func,(LPVOID)&data);
}
我的做法也是你这样的,但是问题是这样的: 消息是不断来的,如果同时来了很多,
就可能多个线程用到了同一个data值, 就会出现结果错误。
所以我考虑直接把消息作为参数发送给线程的函数。
{
// 首先使用静态变量来保存pCopyDataStruct中的内容
COPYDATASTRUCT *pData = new COPYDATASTRUCT;
*pData = *pCopyDataStruct;
//在消息里面启动线程
AfxBeginThread(func,(LPVOID)&data);
}UINT func(LPVOID p)
{
COPYDATASTRUCT * cp=(COPYDATASTRUCT *)p;
MessageBox(NULL,(char *)(cp->lpData),"",0);
delete cp;
}还有,你确定cp->lpData 有字符串的结束标志吗?
若用 PostMessage 会出现指针失效的情况。
因为在你的线程函数执行时指针指向的内容已经失效了,
{
//在消息里面启动线程
AfxBeginThread(func,(LPVOID)&pCopyDataStruct);
}兄弟:
COPYDATASTRUCT* pCopyDataStruct 就说明pCopyDataStruct 为指针了,你再用(LPVOID)&pCopyDataStruct就又引用了一次也就是说变成二级指针了,只要把“&“去了就可以了
(LPVOID)就是一个指向指针的