CopyMemory函数
(1) VatPtr/ StrPtr/ ObjPtr
VarPtr:返回变量地址
StrPtr:返回真正的UNICODE字符串缓冲区的地址
ObjPtr:返回任何对象变量引用的地址
它们是VB提供给我们的好宝贝,它们是VBA函数库中的隐藏函数。为什么要隐藏?因为VB开发小组,不鼓励我们用指针嘛。
VarPtr返回的是变量所在处的内存地址,也可以说返回了指向变量内存位置的指针,它是我们在VB里处理指针最重要的武器之一。
Private Declare Function ObjPtr Lib "MSVBVM60" Alias "VarPtr" (var As Object) As Long
Private Declare Function VarPtr Lib "MSVBVM60" (var As Any) As Long
没有StrPtr,是因为VB对字符串处理方式有点不同,这方面的问题太多,
(2) ByVal和ByRef
ByVal传递的参数值,
ByRef传递的参数的地址。我们不用去区别传指针/传地址/传引用的不同,在VB里,它们根本就是一个东西的三种不同说法,即使VB的文档里也有地方在混用这些术语(但在C++里的确要区分指针和引用)
一定要搞清在里面的CopyMemory调用中,在什么地方要加ByVal,什么地方不加(不加ByVal就是使用VB缺省的ByRef),准确的理解传值和传地址(指针)的区别,是在VB里正确使用指针的基础。
(3)AddressOf
它用来得到一个指向VB函数入口地址的指针,不过这个指针只能传递给API使用,以使得API能回调VB函数。
(4)CopyMemory函数
功能是将从pSource指针所指处开始的长度为byteLen的内存拷贝到pDest所指的内存处。
例如:
Dim k As Long
k = 5
'从保存常数40000的临时变量处拷贝4个字节,到变量k所在的内存中。
CopyMemory ByVal VarPtr(k), 40000, 4 '[ByVal VarPtr(k)把K的地址本身当作值传给函数]
CopyMemory k , 40000, 4 'K传递函数的缺省方法是ByRef, 因此, 也可这样写
CopyMemory ByVal VarPtr(k), ByVal 40000, 4
‘意思是从地址40000拷贝4个字节到变量k所在的内存中。由于地址40000所在的内存未知或不能访问,结果错误
CopyMemory VarPtr(k), 40000, 4
意思就成了,从保存常数40000的临时变量处拷贝4个字节,由于缺省是ByRef,VarPtr(k)为K的地址,将会成为一临时变量,再得到此临时变量的地址,传递给函数。此临时变量的内存地址无任何意义,k的值并没有变。
(5)字符串变量CopyMemory
以ByVal形式传一个字符串变量给pSource,那么源地址就是字符串变量的值,也就是字符串缓冲区的地址。

Sub SwapPtr(sA As String, sB As String)
Dim lTmp As Long
CopyMemory lTmp, ByVal VarPtr(sA), 4
CopyMemory ByVal VarPtr(sA), ByVal VarPtr(sB), 4
CopyMemory ByVal VarPtr(sB), lTmp, 4
End Sub
Sub SwapStrPtr2(sA As String, sB As String)
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, 4
End Sub
Sub SwapStrPtr3(sA As String, sB As String)
Dim lTmp As Long
Dim pTmp As Long, psA As Long, psB As Long
pTmp = StrPtr(sA): psA = VarPtr(sA): psB = VarPtr(sB)
CopyMemory ByVal psA, ByVal psB, 4
CopyMemory ByVal psB, pTmp, 4
End Sub