Set VBiaoFanh = Nothing
      VBiaoFanh = MSComm1.Input
'    Public VBiaoFanh  As Variant  接收数据后VBiaoFanh 变为VBiaoFanh(3)的一个BYTE型数组
'    VBiaoFanh(0)=138  VBiaoFanh(1)=5    VBiaoFanh(2)=  184   VBiaoFanh(3)=107
现在的任务是取VBiaoFanh(1)和VBiaoFanh(2)到变量HUSHU中,VBiaoFanh(1)是其高位,VBiaoFanh(2)是其低位,取出的值应为1464,而下面的操作中却出现了两个值,一个是根据VBiaoFanh(1)和VBiaoFanh(2)得到的4369,另一个是根据数组c(1)和c(2)得到的数值1464。为什么前者的结果不对。
现在的问题
     Dim Hushu As Long
     Hushu = 0
     Dim c(3)  As Byte
      c(0) = VBiaoFanh(0)     '138
      c(1) = VBiaoFanh(1)     '5
      c(2) = VBiaoFanh(2)     '184
      c(3) = VBiaoFanh(3)     '107
      Call CopyMemory(ByVal VarPtr(Hushu), VBiaoFanh(2), 1)             '    Hushu =17
      Call CopyMemory(ByVal VarPtr(Hushu) + 1, VBiaoFanh(1), 1)         '    Hushu =4369      Hushu = 0
      Call CopyMemory(ByVal VarPtr(Hushu), c(2), 1)                     '    Hushu =184
      Call CopyMemory(ByVal VarPtr(Hushu) + 1, c(1), 1)                 '    Hushu =1464为什么同样的COPYMEMORY的格式,得到的值却不一样。

解决方案 »

  1.   

    VBiaoFanh 作为 Variant 变量,它只能可能成为一个数组,编译时无法确定 VBiaoFanh(2) 的类型,所以该调用是这样实现的:
      1) 创建一个临时的 Variant 变量 _Temp
      2) _Temp = VBiaoFanh(2)
      3) Call CopyMemory(ByVal VarPtr(Hushu), _Temp, 1)
    由于运行时 VBiaoFanh(2) 是 Byte 类型,_Temp 的首字节为类型指示 vbByte = 17,所以前两个调用始终只复制了值为 17 的这个字节。而用 c(2) 调用时,编译时数组是明确的,所以的确复制了数组成员。
      

  2.   

    Tiger_Zhao,你真神仙。  你说的这些什么资料上有介绍呀。谢谢。
      

  3.   

    代码里有几处看不明白:
    一、Set VBiaoFanh = Nothing,VBiaoFanh是对象变量还是普通数据变量?
    二、Call CopyMemory(ByVal VarPtr(Hushu) + 1, c(1), 1),为什么要偏移一个字节?
    需要注意的是,对于VARIANT类型的变量来说,一般不要直接使用CopyMemory,因为VARIANT是一个16字节的结构体,前两字节表示数据类型,后8个字节表示数据变量和指向数据的指针。
    当使用Call CopyMemory(ByVal VarPtr(Hushu), VBiaoFanh(2), 1)来复制内容时,其作用是把VARIANT的数据类型(即vt)复制一个字节到Husu中,根本不是复制VBiaoFanh(2)的数据内容。
      

  4.   

    老虎猜对了。没看到楼主对 VBiaoFanh 的声明。但有下面的这些语句:
    Set VBiaoFanh = Nothing
    Dim c(3)  As Byte 
    c(0) = VBiaoFanh(0)    '138 
    c(1) = VBiaoFanh(1)    '5 
    c(2) = VBiaoFanh(2)    '184

    可以推断出  VBiaoFanh 是 Variant 类型的变量。Variant类型 变量所引用内存地址的低8字节是类型相关的描述,高8字节是具体的 值 或指针。
    在执行 VBiaoFanh = MSComm1.Input 后,VBiaoFanh 已经赋值为一个字节数组。
    这时:
    VBiaoFanh 的低8字节是 &H 00000000 00002011
    VBiaoFanh 的高8字节是 &H 00000000 xxxxxxxx (这里的 xxxxxxxx 是那个 Byte数组 描述符的指针)按 TliVarType 的定义:
    Const VT_ARRAY = &H2000
    Const VT_UI1   = &H11    (意思可能是:1字节无符号整数)
    楼主的两次 CopyMemory :
    Call CopyMemory(ByVal VarPtr(Hushu), VBiaoFanh(2), 1)            '    Hushu =17 
    Call CopyMemory(ByVal VarPtr(Hushu) + 1, VBiaoFanh(1), 1)        '    Hushu =4369
    都是把 VBiaoFanh 的类型描述符的低字节拷到 Hushu 中,所以:
    Hushu = &H1111 ,就是十进制的 4369 了。
      

  5.   

    7楼的理解有误。
    VBiaoFanh 的确是数组,但是 VBiaoFanh(2) 是数组成员,绝对不会复制 VBiaoFanh 这个 Variant 的。
    而是如我1楼所述,用了一个临时的 _Temp 变量。改成这样测试
    Call CopyMemory(ByVal VarPtr(Hushu), VBiaoFanh(2), 2) ' Hushu=16401
    16401 = &H4011 = VT_UI1 Or VT_BYREF
    即 _Temp 是对数组成员的引用,正常的 VB 操作(即 VARIANT 操作)都能按照 VT_BYREF 的指示间接对对数组成员进行存取,可惜 CopyMemory 声明的 Any 类型参数是直接对 _Temp 进行操作的。
      

  6.   

    我的问题中有关于VBiaoFanh的类型说明呀。如下:
    '    Public VBiaoFanh  As Variant  接收数据后VBiaoFanh 变为VBiaoFanh(3)的一个BYTE型数组 
    '    VBiaoFanh(0)=138  VBiaoFanh(1)=5    VBiaoFanh(2)=  184  VBiaoFanh(3)=107 
      

  7.   

    VBiaoFanh 接收的数据是 Byte数组,你把它声明成动态 Byte数组 不就解决了吗?
    干吗要弄成 Variant类型 的!