CMscomm m_msComm;    //
void CMyDlg::OnCommMscomm()
{
// TODO: 在此处添加消息处理程序代码
if ( m_msComm.get_CommEvent() == 2 )
{
int nLen = 0;
nLen = m_msComm.get_InBufferCount();
CByteArray byRcvd;
VariantToByteArry( m_msComm.get_Input(), byRcvd, nLen);
}
}方法一/ VARIANT转换为BYTE数组
void CMyDlg::VariantToByteArry( VARIANT& var, CByteArray& byArr, int nLen )
{
var.vt = VT_SAFEARRAY; 
COleSafeArray SafeArray( var );   //构造SafeArray时对象出现异常
SafeArray.GetByteArray( byArr );
int count = byArr.GetCount();}方法二// VARIANT转换为BYTE数组
void CMyDlg::VariantToByteArry( VARIANT& var, CByteArray& byArr, int nLen )
{
BYTE * pBy = ( BYTE * ) var.parray->pvData;
for ( int i = 0; i < nLen; i ++ )
{
byArr.Add( *( pBy + i ) );  //读数据出现异常
}
}
这是为什么呢?.......

解决方案 »

  1.   

    if(var.vt == (VT_ARRAY|VT_UI1))   
    {   
      BYTE *pByte = NULL;   
        
      ::SafeArrayAccessData(var.parray,(void **)&pByte);   
      memcpy(pBuff,pByte,sizeof(HEADER_USERADM));   
      ::SafeArrayUnaccessData(var.parray);   
    }   
      

  2.   


    pBuff从哪来的,干啥的?
      

  3.   

    很明显么,一个BYTE *,你猜也猜到了
      

  4.   

    COleSafeArray SafeArray;
    SafeArray=var;
    int count=SafeArray.GetOneDimSize(); //得到有效数据长度for(int i=0;i<count;i++)
    {
        Byte rxdata;
        SafeArray.GetElement(&i,rxdata);//转换为BYTE型数据
         byArr.Add(rxdata) ;
    }
      

  5.   

    SafeArray=var; 在这一步程序就断了。不知道为什么,是不是对var用什么特殊要求!
      

  6.   

    结贴了,搞了老半天,原来是var有点问题。
    谢谢各位大哥。结合5楼的帮助,
    再加上自己把InputMode设置为1,则接收的var中含有Byte数组型数据。
    如果InputMode设置为0 变量含有String类型数据,
    我想InputMode默认的值应该是0。