activeX和VB之间传递大2进制对象,该用什么数据类型做接口?
我现在
VC里面用VARIANT ,VARIANT中使用SAFEARRAY
VB里面variant,
结果时实时错误13,数据类型不匹配,
这时我的部分代码//////////////VC
[id(4), helpstring("方法GetImage")] LONG GetImage(VARIANT imgBase64,LONG *base64Len);
void *pa;
::SafeArrayAccessData(imgBase64.parray,(void**)&pa);
Base64Encode((BYTE*)data,len,(LPSTR)pa,(int*)base64Len);
::SafeArrayUnaccessData(imgBase64.parray);
/////////////////VB调用
    Dim height As Long, width As Long, N As Long
    Dim re As Long
    Dim imgBase64Data() As Byte
    Dim imgBase64 As Variant
    
    re = lgCam1.GetImgSize(height, width)//这个也时activeX控件里面的函数,声明为[id(3), helpstring("方法GetImgSize")] LONG GetImgSize(LONG* height, LONG* width);调用正确    N = height * width * 2 * 3
    ReDim imgBase64Data(N) As Byte
    imgBase64 = imgBase64Data
    
    re = lgCam1.GetImage(imgBase64, N)//这里不正确,出现实时错误13,类型不匹配//////////////////////////////////////////////////////////
要我在activeX和VB中间传递大块2进制数据,该用什么数据类型做接口呢?

解决方案 »

  1.   

    在vc中使用unsign char *,然后使用vb调用的时候传入byte数组的第n个元素,也就是第n个元素的地址。
      

  2.   

    不过上面说的方法仅用于vc的dll有效。如果楼主做的是ActiveX的,有一个比较方便的方法是。由vb传入一个字节数组的第一个元素地址以及长度,然后由vc在里面写入数据。由于vb是没有指针类型,所以定义的接口必须是占用4个字节的Long型。类似如下的调用方法。
    Dim AllData(99) As Byte
    Obj.GetData(VarPtr(AllData(0)),100)
    然后在vc中将第一个参数其强制转化为unsing char * 即可。