关于LPVOID数据转换,该怎么解决

关于LPVOID数据转换
函数定义如下:
void DefNetMessage(UINT message, LPVOID lpData, int nLength);

收到数据,
DefNetMessage(WM_PROTOCOL_INFO,&m_DataReceive[index],nReadBytes);,其中m_DataReceive是一个二维数组,char m_DataReceive[NORMAL_BUFSIZE][MAX_COM_BUFSIZE];nReadBytes是int类型

处理函数
问题:
void CWATDlg::DefNetMessage(UINT message, LPVOID lpData, int nLength)
{
char *pBuf=(char*)lpData;//这样取数据好像不对,
switch(message)
{
case WM_PROTOCOL_INFO:


请问我要如何转呢,才能正确拿到里面的数据
------解决思路----------------------
char *pBuf=(char*)lpData;//这样取数据好像不对,

要知道 lpData 来自 什么 类型 。
------解决思路----------------------
个人建议还是做一个struct 来做传值。。。
------解决思路----------------------
char m_DataReceive[NORMAL_BUFSIZE][MAX_COM_BUFSIZE];
是数据那就用 一维数组。。收到多少传多少!
------解决思路----------------------
struct  Buf

int nCount; //接受次数
char cRead[MAX_PATH]; //接受数据

------解决思路----------------------
转换没错, 像 是 数据错误。
------解决思路----------------------
Buf  strBuf;

DefNetMessage(WM_PROTOCOL_INFO,&strBuf,nReadBytes),


Buf *pBuf =(Buf*) lpData;
------解决思路----------------------
“unsigned char *pBuf=(unsigned char*)lpData;”

这个指针不要动他 (+ -), 可以复制一个指针 动 复制的
------解决思路----------------------
像这种程序 case WM_PROTOCOL_INFO:

需要 主线程 处理完后 给 子线程 一个 处理完 消息;

即 子线程:
1.发消息
2.等主线程回答。

主线程:
1.处理消息
2.发消息处理结束。
------解决思路----------------------
“我的case WM_PROTOCOL_INFO:是在工作者线程里面处理的”

如果 同一个线程 没 问题。
不同线程 可以 按我说的做, 也 可以 加锁。
------解决思路----------------------
引用:
Quote: 引用:

像这种程序 case WM_PROTOCOL_INFO:

需要 主线程 处理完后 给 子线程 一个 处理完 消息;

即 子线程:
1.发消息
2.等主线程回答。

主线程:
1.处理消息
2.发消息处理结束。
另外,我的case WM_PROTOCOL_INFO:是在工作者线程里面处理的,也就是子线程里面收到数据就调用这个函数处理,处理之后发现会出现这个访问冲突的错误。


这个错误有两种可能造成:
1. 你处理函数没写好,读写超过了buffer的范围而访问了非法地址。
2. 你子线程处理时,该buffer已经被主线程删除了。
------解决思路----------------------
引用:
同时对你第二个观点想问下,buffer被主线程删除?什么时候会被主线程删除?为啥会被删除?假设真遇到这个情况,解决方法是如何?谢谢!


如果buffer指针是放在结构中由主线程传入子线程的话,如果设计不好,主线程将局部结构变量的地址传入子线程然后它函数返回了。 结果就是子线程处理时该地址内容已经被覆盖造成结构中buffer指针指向其它未知位置。
------解决思路----------------------
重新转换回去即可