关于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:是在工作者线程里面处理的”
如果 同一个线程 没 问题。
不同线程 可以 按我说的做, 也 可以 加锁。
------解决思路----------------------
这个错误有两种可能造成:
1. 你处理函数没写好,读写超过了buffer的范围而访问了非法地址。
2. 你子线程处理时,该buffer已经被主线程删除了。
------解决思路----------------------
如果buffer指针是放在结构中由主线程传入子线程的话,如果设计不好,主线程将局部结构变量的地址传入子线程然后它函数返回了。 结果就是子线程处理时该地址内容已经被覆盖造成结构中buffer指针指向其它未知位置。
------解决思路----------------------
重新转换回去即可
函数定义如下:
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:是在工作者线程里面处理的”
如果 同一个线程 没 问题。
不同线程 可以 按我说的做, 也 可以 加锁。
------解决思路----------------------
这个错误有两种可能造成:
1. 你处理函数没写好,读写超过了buffer的范围而访问了非法地址。
2. 你子线程处理时,该buffer已经被主线程删除了。
------解决思路----------------------
同时对你第二个观点想问下,buffer被主线程删除?什么时候会被主线程删除?为啥会被删除?假设真遇到这个情况,解决方法是如何?谢谢!
如果buffer指针是放在结构中由主线程传入子线程的话,如果设计不好,主线程将局部结构变量的地址传入子线程然后它函数返回了。 结果就是子线程处理时该地址内容已经被覆盖造成结构中buffer指针指向其它未知位置。
------解决思路----------------------
重新转换回去即可