看了msdn的帮助介绍,连接了CopyMemory。自己弄了试试,却发现
这个是自定义交换函数
开始:a=50,b=60
    调用MemC(a,b)后,返回的a,b值应该是交换后的,结果应该是a=60,b=50,但结果却是a=60,b=60,各位,麻烦调试一下,看看这个是否是vb对内存操作的不完善?Private Sub MemC()
Dim a As Long, b As Long
a = 50
b = 60
SwapPtr a, b
End SubFunction SwapPtr(sA As Long, sB As Long)
Dim pTmp As Long, psA As Long, psB As Long
Dim Temp As Long
psA = VarPtr(sA)
psB = VarPtr(sB)CopyMemory Temp, ByVal psA, 4
    '此时Temp=50
CopyMemory Temp, ByVal psB, 4
    '此时Temp=60CopyMemory pTmp, psA, 4
CopyMemory Temp, ByVal pTmp, 4
    '此时Temp=50CopyMemory psA, psB, 4
CopyMemory Temp, ByVal psA, 4
    '此时Temp=60CopyMemory psB, pTmp, 4
CopyMemory Temp, ByVal psB, 4
    '此时Temp=50CopyMemory sA, ByVal psA, 4
    '此时sA=60CopyMemory sB, ByVal psB, 4   '问题出在这里,这个sB的值应该换成sA的值了,sB=50
    '此时sB=60End Function

解决方案 »

  1.   

    我的注释如下(注释x:...),而且你的代码非常之乱,交换个数据写了一大堆代码,完了还不知道你是要干什么。CopyMemory Temp, ByVal psA, 4
        '此时Temp=50
    CopyMemory Temp, ByVal psB, 4
        '此时Temp=60CopyMemory pTmp, psA, 4   '注释1:pTmp=psA=sA的地址了
    CopyMemory Temp, ByVal pTmp, 4
        '此时Temp=50CopyMemory psA, psB, 4
    CopyMemory Temp, ByVal psA, 4
        '此时Temp=60CopyMemory psB, pTmp, 4   '注释2:此时psB=pTmp=sA的地址了
    CopyMemory Temp, ByVal psB, 4
        '此时Temp=50CopyMemory sA, ByVal psA, 4
        '此时sA=60CopyMemory sB, ByVal psB, 4   '注释3:此时将sB赋值为 sA的值,即sB=sA=60,结果完全在预料之中
        '此时sB=60
      

  2.   

    有些语句是调试的时候加上去的。
    实际上是3句:
    CopyMemory pTmp, psA, 4  相当于 pTemp->psA  *pTmp=50 *psA=50
    CopyMemory psA, psB, 4   相当于  psA->psB  *psA=60  *psB=60
    CopyMemory psB, pTmp, 4  相当于  psB->pTmp  *psB=60 
    也就是说,执行了CopyMemory psB, pTmp, 4 语句后,*psB=60,哪怎么会反而等于*psB=50呢如果省略了CopyMemory sA, ByVal psA, 4这条语句。那最后sA=60,sB=50,交换成功了。
    看来CopyMemory sA, ByVal psA, 4这条语句不单单是取值。。
      

  3.   

    Private Declare Function VarPtr Lib "MSVBVM60" (var As Any) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)Sub test()
    Dim a As Long, b As Long
    a = 5
    b = 6
    MemC a, b
    End Sub
    Function MemC(sA As Long, sB As Long)Dim lTmp As Long
    Dim pTmp As Long, psA As Long, psB As Long
    pTmp = VarPtr(lTmp)
    psA = VarPtr(sA)
    psB = VarPtr(sB)
    CopyMemory pTmp, psA, 4
    CopyMemory psA, psB, 4
    CopyMemory psB, pTmp, 4End Function
    这样就好用了。
      

  4.   

    Private Declare Function VarPtr Lib "MSVBVM60" (var As Any) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Long, Source As Long, ByVal Length As Long)  '这里变成按地址传值Sub test()
    Dim a As Long, b As Long
    a = 5
    b = 6
    MemC a, b
    End Sub
    Function MemC(sA As Long, sB As Long)Dim lTmp As Long
    Dim pTmp As Long, psA As Long, psB As Long
    pTmp = VarPtr(lTmp)
    psA = VarPtr(sA)
    psB = VarPtr(sB)
    CopyMemory pTmp, psA, 4
    CopyMemory psA, psB, 4
    CopyMemory psB, pTmp, 4End Function
    这样运算结果就不一样了。
      

  5.   

    如果函数是这样声明的
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Long, Source As Long, ByVal Length As Long) 
    CopyMemory pTmp, psA, 4  :这句话相当于pTmp=psA   lTmp的值没有改变
    CopyMemory psA, psB, 4   :这句话相当于psA=psB sA的值也么有改变
    CopyMemory psB, pTmp, 4 :这句话相当于psB=pTmp sB的值也没有改变
    因为ByRef本省就是传地址,而Byval是传值,你上面传的是指针变量的地址,
    所以改变的是指针的值
    如果函数是这样声明的
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
    CopyMemory pTmp, psA, 4  :这句话相当于lTmp=psA   
    CopyMemory psA, psB, 4   :这句话相当于sA=sB 
    CopyMemory psB, pTmp, 4 :这句话相当于sB=Tmp 
    当然成功了
      

  6.   

    byval ,和默认的byref,我上面都可以通过了。只不过如果用byref的话,要麻烦点。
      

  7.   

    Private Declare Function VarPtr Lib "MSVBVM60" (var As Any) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Long, Source As Long, ByVal Length As Long)Function MemC(sA As Long, sB As Long)
    Dim lTmp As LongCopyMemory lTmp, sA, 4
    CopyMemory sA, sB, 4
    CopyMemory sB, lTmp, 4End Function