描述:
ATL复合控件编写了一个串口控件MyComm,对话框中放置了微软的MSComm串口控件,对话框初始化时调用GetDlgControl(IDC_COMM,IID_IMSComm,(void**)&m_comm)得到了MSComm接口,编程过程中遇到了两个问题。
(1)生成了MSComm的消息响应函数OnComm,但在串口有返回数据时,该函数没有任何响应,可恨!
(2)在网页中调用MyComm,反复调用其他函数没错,当调用Read函数次数多的时候,尤其在刷新页面时,IE就会死掉,说不上什么时候会死,但次数多了最终肯定会死,应该是内存有泄漏,但找了好多天也没找出来。
众位大虾指点指点,多谢。
Read函数是从串口读入byte串,然后转换为字符串输出,例如{12,126,9,26,8}转换为"12,126,9,26,8",代码如下:
STDMETHODIMP CMyComm::Read(BSTR *result)
{
char sNum[3]={'0','0','0'};
CComBSTR bstrNum="";
byte bNum=0;
short inBufferCount=0;
VARIANT va;
::VariantInit(&va);
va.vt=VT_ARRAY|VT_UI1;
m_comm->get_InBufferCount(&inBufferCount); //接收的byte串长度(m_comm为微软串口控件)
SAFEARRAY * psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = inBufferCount;
psa = SafeArrayCreate(VT_UI1,1,rgsabound);
if(inBufferCount!=0){
m_comm->get_Input(&va); //从串口接收byte串
psa = va.parray;
for(long len=0;len<inBufferCount;len++){
::SafeArrayGetElement(psa,&len,&bNum); //取串口byte到bNum
::itoa(bNum,sNum,10);
bstrNum.Append(sNum);
if(len!=inBufferCount-1){ //数字之间加,号
bstrNum.Append(",");
}
}
bstrNum.CopyTo(result); //返回result
::VariantClear(&va);
}
::SafeArrayDestroy(psa);
bstrNum.Empty();
return S_OK;
}