16,548
社区成员




void CBeijingDlg::OnOnCommMscomm1()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
m_ctrlComm.SetInBufferCount(0);
if(rxdata[0]==0x31)
{
m_FlashPlayer.LoadMovie(0,"D:\\huagui\\1.swf");
}
else if(rxdata[0]==0x32)
{
m_FlashPlayer.LoadMovie(0,"D:\\huagui\\2.swf");
}
else if(rxdata[0]==0x33)
{
m_FlashPlayer.LoadMovie(0,"D:\\huagui\\3.swf");
}
else if(rxdata[0]==0x34)
{
m_FlashPlayer.LoadMovie(0,"D:\\huagui\\4.swf");
}
else if(rxdata[0]==0x35)
{
m_FlashPlayer.LoadMovie(0,"D:\\huagui\\5.swf");
}
else
{
}
}
}
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
BYTE *rxdata = _alloca(len); //动态分配缓冲区
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
这句话是从数组rxdata里拿数据吗?for循环之前没检查一下循环次数是否大于数字大小
数组大小 for循环之前没检查一下循环次数是否大于数字大小
for循环之前没检查一下循环次数是否大于数字大小
貌似,COleSafeArray::GetOneDimSize是获得数组维度,返回值应该一直是1,就是一维数组,不是指数据有1个
[quote=引用 8 楼 wozhaolala 的回复:] [quote=引用 7 楼 worldy 的回复:] 这个不是内存泄露,而是内存非法访问了,估计是len值大于等于2048造成内存访问越界;看你的代码len值好像没有赋值!!
这句话是从数组rxdata里拿数据吗?safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组