各位高手,我在做一个有关CDMA通信的ActiveX控件,控件中包含一个方法,它的主要功能是将编码后的CDMA指令发送出去,然后由调用该控件的程序读出,并经过串口发送给CDMA模块。    在我编码的指令中存在着(0x00,0x31)(代表“1”的unicode码),当我把“方法”的返回类型选为BSTR时,0x00会被当成CString的结束符而被舍弃,可问题是,在这个指令中,0x00是必须要传的,否则CDMA接收时,会无法翻译成“1”。    请问我该怎么解决这个问题呢,已经困扰我很久了,比如ACtiveX的方法类型中,有类似char[]型的类型吗,或是有其它不影响0x00的传输类型呢,谢谢了。    焦急等待中……

解决方案 »

  1.   

    BSTR里面可以有0x00的,UINT SysStringLen(
      BSTR bstr 
    ); 获取长度
      

  2.   

    sys0009你好,我的控件方法虽然定义成了BSTR类型的,可是在外部程序调用时,却被默认成了CString型的,所以结果还是被舍弃了,这个怎么办呢?
      

  3.   

    用BYTE*有什么问题吗? 我看到有人做com数据的时候无论如何传出参数类型都是BYTE*, 看来是有道理的。
      

  4.   

    回复allenhiman,BYTE*应该没问题,可是在AciveX中的方法类型定义中没有BYTE*这个类型,该怎么办呢我想使用VARIANT这个类型,如
    VARIANT CMessageCtrl::Send2() 
    {
    VARIANT vaResult;
    VariantInit(&vaResult);
    vaResult.vt = VT_UI1|VT_BYREF;
    char a[] = "sb";
    vaResult.pbVal = (BYTE*)a;
    return vaResult;
    }但是外部调用控件的函数
    void CInsms3Dlg::OnOK() 
    {
    VARIANT vaResult;
    VariantInit(&vaResult);
    vaResult = m_message.Send2();
    }中的vaResult却接收不到传过来的数据,我试过定义个返回值是VARIANT的函数就能传递变量值,ActiveX控件为何就不行呢
      

  5.   

    你的Send2里的代码vaResult是局部变量,当函数返回自动释放了。你可以通过传入一个VARIANT*给控件的Send2,然后由Send2来填充返回。
      

  6.   

    HRESULT CMessageCtrl::Send2(VARIANT * pOut) 

    pOut->vt = VT_UI1|VT_BYREF; 
    char a[] = "sb"; 
    pOut->pbVal = (BYTE*)a; 
    return S_OK; 
    } 外部调用控件的函数 
    void CInsms3Dlg::OnOK() 

    VARIANT vaResult; 
    VariantInit(&vaResult); 
    m_message.Send2(&vaResult); 
    }
      

  7.   

    回复tab0tab,方法我试过了,可是vaResult.pbVal的值是空,还是没有传过来的,为什么呢
      

  8.   

    pOut->pbVal需要申请内存。HRESULT CMessageCtrl::Send2(VARIANT * pOut)
    {
    pOut->vt = VT_UI1|VT_BYREF;TCHAR szText[] = _T("Test");pOut->pbVal = CoTaskMemAloc(lstrlen(szText)*sizeof(TCHAR));
    memcpy(pOut->pbVal, szText, lstrlen(szText)*sizeof(TCHAR));
    return S_OK;
    }外部调用控件的函数
    void CInsms3Dlg::OnOK()
    {
    VARIANT vaResult;
    VariantInit(&vaResult);
    m_message.Send2(&vaResult);
    }