colesafearray,关于串口通信中COleSafearray的问题,怎么解决
尊敬的读者,colesafearray和关于串口通信中COleSafearray的问题,怎么解决是当前备受关注的话题,但许多人对其仍存在疑惑。在本篇文章中,我将为你提供清晰的解释和深入的分析,希望能满足你的求知欲望。
关于串口通信中COleSafearray的问题,怎么解决
其实前面已经问过了,不过不能问题补充,所以再发一次
答到的,其实加起来就是120+70分了,大家帮帮忙啊
在编一个串口通信程序,因为刚上手,所以是按着龚建伟书的第一章改写的。
在处理接收数据的函数中
void CSerTestDlg::OnComm()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048];
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2)
{
variant_inp=m_ctrlComm.GetInput();//第一步
safearray_inp=variant_inp;//第二步
len=safearray_inp.GetOneDimSize();//第三步
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);
for(k=0;k<len;k++)
{
char bt=*(char*)(rxdata+k);
strtemp.Format("%c",bt);
m_strEditRXData+=strtemp;
UpdateData(FALSE);
}
}
}
我用debug查看,第一步的结果是对的,数据放入到我定义的缓冲区variant_inp中
第二步弹出错误框,但忽略后safearray_inp也接收到数据
第三步又弹出错误框,但忽略后得到的有效数据长度len是一个负数。
结果后面就一直错下去了。
请教一下大家是不是safearray_inp=variant_inp;出了什么问题,怎么改?
ps:进一步调试后我发现似乎是COleSafeArray这个结构的问题
不单只是safearray_inp=variant_inp的问题
第二步改为 safearray_inp.Attach( variant_inp)还是要报错。忽略后,
我即使手动把len=safearray_inp.GetOneDimSize()
改为len=70
在下面的程序中safearray_inp.GetElement(&k,rxdata+k)还是要报错。
也就是说凡是涉及safearray_inp的都会出错。
我想请教一下为什么,望不吝赐教
ps:我试用了下面这种方法,但还是死在Safearray上
void CSerTestDlg::OnComm()
{
COleVariant varInput;
COleSafeArray safearray_inp;
LONG lLen= 0;
LONG i= 0;
BYTE rxdata[2048];//设置BYTE数组 An 8-bIT integerthat is not signed.
//注意:设置接收数据
if(2== m_ctrlComm.GetCommEvent())//事件值为2表示接收缓冲区内有字符
{
varInput.Attach(m_ctrlComm.GetInput());//读缓冲区
safearray_inp= varInput;//VARIANT型变量转换为ColeSafeArray型变量
lLen= safearray_inp.GetOneDimSize();//得到有效数据长度
for(i= 0; i< lLen; i++)
{
safearray_inp.GetElement(&i, rxdata+i);//转换为 BYTE型数组
}
m_strEditRXData+=(char*)rxdata;
UpdateData(FALSE);//更新编辑框内容
}
怎么使用COleSafeArray实现二维数组将字符串写入excel
如何使用COleSafeArray实现二维数组将字符串写入excel
// VARTYPE vt= VT_BSTR;/*数组元素的类型,string*/
VARTYPE vt= VT_I4;/*数组元素的类型,long*/
SAFEARRAYBOUND sabWrite[2];/*用于定义数组的维数和下标的起始值*/
sabWrite[0].cElements= 1;
sabWrite[0].lLbound= 0;
sabWrite[1].cElements= 3;
sabWrite[1].lLbound= 0;
COleSafeArray olesaWrite;
olesaWrite.Create(vt, sizeof(sabWrite)/sizeof(SAFEARRAYBOUND), sabWrite);
/*通过指向数组的指针来对二维数组的元素进行间接赋值*/
long(*pArray)[2]= NULL;
olesaWrite.AccessData((void**)&pArray);
memset(pArray, 0, sabWrite[0].cElements* sabWrite[1].cElements* sizeof(long));
/*释放指向数组的指针*/
olesaWrite.UnaccessData();
pArray= NULL;
/*对二维数组的元素进行逐个赋值*/
long index[2]={0, 0};
long lFirstLBound= 0;
long lFirstUBound= 0;
long lSecondLBound= 0;
long lSecondUBound= 0;
olesaWrite.GetLBound(1,&lFirstLBound);
olesaWrite.GetUBound(1,&lFirstUBound);
olesaWrite.GetLBound(2,&lSecondLBound);
olesaWrite.GetUBound(2,&lSecondUBound);
for(long i= lFirstLBound; i<= lFirstUBound; i++)
{
index[0]= i;
for(long j= lSecondLBound; j<= lSecondUBound; j++)
{
index[1]= j;
long lElement= str[j];
//CString lElement= ch;
olesaWrite.PutElement(index,&lElement);
}
}
/*把ColesaWritefeArray变量转换为VARIANT,并写入到Excel表格中*/
VARIANT varWrite=(VARIANT)olesaWrite;
range.put_Value2(varWrite);
这样能将输入的整形写入excel,当变成VT_BSTR报内存不足,求指导如何修改
------解决方案--------------------
可以通过另外一种写法,
CRange write_range= start_range.get_Offset(COleVariant((long)7),COleVariant((long)j));
write_range.put_Value2((COleVariant)(str[j]));
文章分享结束,colesafearray和关于串口通信中COleSafearray的问题,怎么解决的答案你都知道了吗?欢迎再次光临本站哦!