CopyMemory函数
(1) VatPtr/ StrPtr/ ObjPtr
VarPtr :返回变量地址
StrPtr :返回真正的unicode字符串缓冲区的地址
ObjPtr :返回任意对象变量引用的地址
它们是VB愿意提供给我们的好宝物,它们是VBA函数库中的隐藏函数。 为什么要隐瞒? 因为VB开发团队不鼓励我使用指针哦。
VarPtr返回变量所在位置的内存地址。 也可以说返回了指向变量内存位置的指针。 这是我们在VB上处理指针最重要的武器之一。
privatedeclarefunctionobjptrlib ' msvbvm60 ' alias ' varptr ' (varas object ) As Long
privatedeclarefunctionvarptrlib ' msvbvm60 ' (varas any ) As Long
没有StrPtr,是因为VB对字符串处理方式有点不同,这方面的问题太多,
(2) ByVal和ByRef
ByVal传递的参数值是、
ByRef传递的参数的地址。 无需区分指针传递/地址传递/引用传递之间的差异。 在VB中,它们基本上是一个事物的三种不同的说法,VB文档中也有混合使用这些术语的地方。 (但是,在c中必须区分指针和引用)
在对内向菠萝的CopyMemory调用中,清楚ByVal放在哪里,不放在哪里,准确理解传递价格和传递地址(指针)之间的区别是在VB中正确使用指针的基础。
(3)AddressOf
用于获取指向VB函数条目地址的指针,但该指针只能传递给API,以便API可以回调VB函数。
(4)CopyMemory函数
privatedeclaresubcopymemorylib ' kernel32 ' alias ' rtlmovememory ' (pdestasany、pSourceAsAny、ByValbyteLenAsLong )的功能是psouus
其中,源地址和目标地址都声明为Any类型。
以下内容说明复制内存了解不同格式的参数。 (1)如果将变量传递给pSource,则源地址为变量所在的地址。 )2)如果以ByVal格式将变量传递给pSource,则源地址为变量值
例如:
Dim k As Long
k=5
'从保存有常数40000的临时变量中复制4字节,保存在变量k所在的存储器中。
copymemorybyvalvarptr(k )、40000、4 ' [ byval varptr ] k )将k的地址本身作为值传递给函数]
复制内存k、40000和4'k传递函数的默认方法是ByRef,因此也可以这样写
版权所有byvalvarptr (k ),byval 40000,4
“意思是从地址40000向有变量k的存储器复制4字节。 结果错误,因为地址40000所在的内存未知或无法访问
复制内存验证器(k ),40000,4,4
意思是。 从保存常数40000的临时变量复制4字节。 因为默认值为ByRef,所以varptr(k )是k的地址,是临时变量。 得到这个临时变量的地址并传递给函数。 该临时变量的内存地址没有任何意义,k的值不变。
(5)字符串变量CopyMemory
字符串变量的值是字符串缓冲区的地址,也就是指向StrPtr(Str1)的指针。
如果以ByVal格式将字符串变量传递给pSource,则源地址是字符串变量的值,即字符串缓冲区的地址。 下表总结了传递给CopyMemory的常见参数的格式。 注: (1)根据http://www.Sina.com/bytelen实际规定的字节数多少,可能会有所不同,但这里只是粗略估计。 )2)在加亮的两行中,VB会自动对字符串参数进行UA转换,所以实际的复制内存操作是对通过String1转换得到的ANSI字符串_tmp1进行的。 )3)取到的内容列显示了可用于检索有效数据byteLen参数的数字范围。 简单地说,如果pSource的参数是字符串型,则字节len的字节数是与String1对应的ANSI字符串的长度。 理解这一点也很简单,只要记住CopyMemory此时实际上在操作ANSI字符串就可以了。 如果不发生字符串转换,则如正反第4行所示,复制String1的LebB长度。 这也可以理解。 如果不发生转换,CopyMemory实际上是直接复制Unicode字符串的内容吧。 subswapptr(saasstring,sB As String ) Dim lTmp As Long CopyMemory lTmp,byvalvarptr ) sa ),4copymemorybyvalvarptr ) sa,byvary 4copymemorybyvalvarptr )4copymemorybyvalvarptr(sb )、lTmp、4endsubswapstrptr2) sB As String、sB As String ) dim ltmp as long PSA as long psbaslongptmp=varptr (ltmp ) :psA=varptr ) sa ) :PSB=varptr ) sb )复制内存ptmp、PSA、4复制内存PP
'交换两个字符串的最快方法subswapstrptr3(saasstring,sB As String ) Dim lTmp As Long Dim pTmp As Long,psA As Long, PSBaslongptmp=strptr(sa ) :PSA=varptr ) sa ) :PSB=varptr ) sb ) CopyMemory ByVal psA,ByVal psB,4 copymemorymemorybyvyvyval