看了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
这个是自定义交换函数
开始: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
'此时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
实际上是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这条语句不单单是取值。。
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
这样就好用了。
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
这样运算结果就不一样了。
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
当然成功了
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