读书人

vb调用 vc编写activex控件传入字符数

发布时间: 2012-04-09 13:41:24 作者: rapoo

vb调用 vc编写activex控件,传入字符数组问题
遇到一下问题, VB代码如下:

VB code
Private Sub test12_Click()    Dim szName As String    Dim iRet As Integer    Dim MyVar As Variant    ReDim MyVar(0 To 7) As Byte                MyVar(0) = &HA0    MyVar(1) = &H0    MyVar(2) = &H0    MyVar(3) = &H2    MyVar(4) = &H41    MyVar(5) = &H0    MyVar(6) = &H0    MyVar(7) = &H0        'szName = "A0 00 00 02 41 00 00 00"    'MyArr = VarPtr(HexStr2Byte(szName))    iRet = ICBCControl1.SelectbyName(MyVar)   //-->调用OCX方法         MsgBox (iRet)End Sub


VC中方法实现:
C/C++ code
short CICBCControlCtrl::SelectbyName(const VARIANT FAR& ID)  // <--{    // TODO: Add your dispatch handler code here        BYTE abyID[MAXTMP];    short cbID = MAXTMP;    if ( !VARIANTToBinary(ID, abyID, cbID) )    //--> 调用,实现如下        return _ERR_TCHANGE_IN;//.......}//将 variant中safearray 转换为数组。BOOL VARIANTToBinary(VARIANT InArray, BYTE* pbuf, short& len)  //<-- 实现{    if ( (VT_BYREF | VT_UI1) != InArray.vt  )   //每次在该处断掉,断点InArray.vt 为 VT_VARIANT|VT_BYREF        return FALSE;    if ( 1 != InArray.parray->cDims )        return FALSE;        //ATLASSERT( VT_UI1 == InputArray.parray->)    BYTE *pValue = NULL;    SafeArrayAccessData(InArray.parray,(void**)&pValue);    if ( pValue == NULL)        return FALSE;    int count = InArray.parray->rgsabound[0].cElements;    memcpy(pbuf, pValue, count);    len = count;    SafeArrayUnaccessData(InArray.parray);    return TRUE;}


求解各位大大这样传递是否正确, 如果不正确改如何传递数组?
或者有好的方法传递字节数组?

[解决办法]
SAFEARRAY()
[解决办法]
应该是
SAFEARRAY()

忘了怎么用了
[解决办法]
如果传字符数组的话,可以直接用BSTR

http://zh.wikipedia.org/wiki/BSTR.
[解决办法]
探讨

引用:
SAFEARRAY()

谢谢,不太理解SAFEARRAY()。
但是,MFC ACTIVE CONTROLWIZARD 不会自动产生参数类型SAFEARRAY,所以我用到了VARIANT。
请看VC 编写的 ocx 方法中的参数:
. short CICBCControlCtrl::SelectbyName(const VARIANT ……

读书人网 >VC/MFC

热点推荐