MFC WinSock ActiveX 控件开发实例 高级篇(1)
两个接口的参数除了第一个参数外,其它都类似。SendData()是发送数据,不要求将数据带回,因此直截用 VARIANT,而GetData()则要求将数据带回来给调用者,因此定义为 VARIANT *类型,第二个参数DataType故名思义是定义所传送或接受数据的类型,第三个参数是传送或接受数据的长度,这里的长度以char作为一个长度,倘若传入的类型是int类型,则长度为4,如果定义的是字符串,一个中文字符占用2个长度。最后一个参数,是网络发送或读取时的超时时间。
三、为Connect()接口添加源代码,看起来如下://网络数据发送,在指定的超时时间内进行发送然后返回,成功返回实际发送字节数,否则返回负数
long CMFCWinSockCtrl::SendData(const VARIANT FAR& Data,
const VARIANT FAR& DataType,
const VARIANT FAR& DataLength,
const VARIANT FAR& TimeOut)
{
// TODO: Add your dispatch handler code here
if(!OnlySock)
return -1;//网络尚未开始树立联接
int gDataType = VariantToLong(DataType);
long gDataLength = VariantToLong(DataLength);
int gTimeOut = VariantToLong(TimeOut);
if(gDataType >24)&0xff;
buffer[m++] = (gData.lVal>>16)&0xff;
buffer[m++] = (gData.lVal>>8)&0xff;
buffer[m++] = gData.lVal&0xff;
}
}
else//long = char*1 //数据可能溢出
{
buffer = new char[gDataLength];
for(m=0,n=0; n<gDataLength; n++)
{
SafeArrayGetElement(Data.parray,&n,&gData.lVal);
buffer[n] = (char)gData.lVal;
}
}
break;
case VT_ARRAY|VT_INT://以整型数组发送
gData.vt = VT_INT;
if(gDataType != 0)
{
//一个int等于四个char
buffer = new char[gDataLength];
for(m=0,n=0; n<gDataLength/4; n++)
{
SafeArrayGetElement(Data.parray,&n,&gData.intVal);
buffer[m++] = (gData.intVal>>24)&0xff;
buffer[m++] = (gData.intVal>>16)&0xff;
buffer[m++] = (gData.intVal>>8)&0xff;
buffer[m++] = gData.intVal&0xff;
}
}
else
{
buffer = new char[gDataLength];
for(n=0; n<gDataLength; n++)
{
SafeArrayGetElement(Data.parray,&n,&gData.intVal);
buffer[n] = (char)gData.intVal;
}
}
break;
case VT_ARRAY|VT_UI1://以BYTE数组发送
gData.vt = VT_UI1;//一个char等于一个BYTE不必进行转换
buffer = new char[gDataLength];
for(n=0; n<gDataLength; n++)
{
SafeArrayGetElement(Data.parray,&n,&gData.bVal);
buffer[n] = gData.bVal;
}
break;
default://在这里没有一一列出其它类型,剩下的就由阁下进行数据转换处理了,我就偷懒了^_^
return -3;//传入的数据类型不被支持
}
len = send(OnlySock, buffer, gDataLength, 0);//发送数据
delete[] buffer;
buffer = NULL;
if (len
在这里,我们利用了_com_util:
