VB指针 与CopyMemory

本文深入探讨了ByVal和ByRef的区别,并通过具体的CopyMemory示例解释了它们如何影响内存操作。文章还展示了如何使用指针进行更安全的数据交换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


体会ByVal和ByRef
Dim k As Long

CopyMemory ByVal VarPtr(k), 40000, 4
等同于k=40000;从保存常数40000(缺省ByRef)的临时变量处(地址)拷贝4个字节到变量k所在的内存中。

CopyMemory ByVal VarPtr(k), ByVal 40000, 4
k=(40000的地址);从地址40000拷贝4个字节到变量k所在的内存中。由于地址40000所在的内存我们无权访问,操作系统会给我们一个Access Violation内存越权访问错误

CopyMemory VarPtr(k), 40000, 4
从保存常数40000的临时变量处(地址)拷贝4个字节(即40000),到保存变量k所在内存地址值的临时变量处。这不会出出内存越权访问错误,但k的值并没有变。

'看看我们的东西被拷贝到哪儿去了
Sub TestCopyMemory()
  Dim i As Long, k As Long
  k = 5
  i = VarPtr(k)
  CopyMemory i, 40000, 4 'NOTE4:
  Debug.Print k
  Debug.Print i

  i = VarPtr(k)
  CopyMemory ByVal i, 40000, 4 'NOTE5:
  Debug.Print k
End Sub

   程序输出:
5
40000
40000
由于NOTE4处使用缺省的ByVal,传递的是i的地址(也就是指向i的指针),所以常量40000拷贝到了变量i里,因此i的值成了40000,而k的值却没有变化。但是,在NOTE4前有:i=VarPtr(k),本意是要把i本身做为一个指针来使用。这时,我们必须如NOTE5那样用ByVal来传递指针i,由于i是指向变量k的指针,所以最后常量40000被拷贝了变量k里

 

'使用更安全的CopyMemory,明确的使用指针!
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
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

   注意,上面CopyMemory的声明,用的是ByVal和long,要求传递的是32位的地址值,当我们将一个别的类型传递给这个API时,编译器会报错,比如现在我们用下面的语句:

转载于:https://www.cnblogs.com/whchensir/p/4135560.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值