MFC WinSock ActiveX 控件开发实例 高级篇(1)

文章摘要:摘要:本文主要讲述MFC WinSock ActiveX 利用VARIANT类型作参数进行的网络数据传送和接收,以及SAFEARRAY,BSTR的详细使用方法。 另外还提供该控件在VC,VB下的调用方式以及相关数据的处理。 关键字:ActiveX,Socket,VARIANT, SAFEARRAY,BSTR。 回顾:在上一篇文章《标准MFC WinSock ActiveX控件开发实例》中我们详细介绍了控件的开发过程,以及接口和事件的 添加和响应方法。 һϢϵͳ








һϢϵͳܱǸύлʵкϵͳĹؼʻIPܵ˷ƣβЧϵͳѼ¼IPύݡע⣬ҪύκΥҹ涨ݣصϢΪgooglesyndication
}

两个接口的参数除了第一个参数外,其它都类似。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: