专栏首页VBA 学习VBA实现自己的ArrayPtr取数组地址函数

VBA实现自己的ArrayPtr取数组地址函数

在VBA数据类型Array中,我们提到了取数组的函数,是使用1个API函数VarPtrArray ,要声明这么一个不大常用的API总觉得不大方便,我就在想能不能不需要API也可以获取到数组的地址呢?

VBA指针Pointer里提到了3个取地址函数,VarPtr、StrPtr、ObjPtr。

其中提到了我们只需要VarPtr函数,是可以获取StrPtr、ObjPtr返回的地址的。

在VARANT里,我们讲到了Variant这个类型,它可以保存任何的类型,通过它的一个转换,我们不就可以获取到数组的地址吗?

是的,我们只要把1个数组赋值给1个Variant,然后去读取Variant里面的b8-11位,那获取的就是数组的地址或者是地址的地址了:

    - 0x20 8-11存的是数组地址
    - 0x60 8-11存的是数组地址的地址

实现代码:

Sub TestMyArrayPtr()
    Dim Arr() As Byte
    ReDim Arr(3) As Byte
    Dim ptr As Long '保存[Arr指针]的地址
    
    CopyMemory VarPtr(ptr), VarPtrArray(Arr), 4
    Printf "VarPtrArray(Arr) = 0x%x, ptr = 0x%x", VarPtrArray(Arr), ptr
    
    Printf "MyArrayPtr(Arr) = 0x%x", MyArrayPtr(Arr)
End Sub

Function MyArrayPtr(ByRef v As Variant) As Long
    Dim b(16 - 1) As Byte
    
    CopyMemory VarPtr(b(0)), VarPtr(v), 16
    Printf "b = 0x% x", b
    
    Dim ptr As Long
    CopyMemory VarPtr(ptr), VarPtr(b(8)), 4
'    - 0x20 8-11存的是数组地址
'    - 0x60 8-11存的是数组地址的地址
    If b(1) = &H60 Then
        CopyMemory VarPtr(ptr), ptr, 4
    End If
    
    MyArrayPtr = ptr
End Function
输出:
VarPtrArray(Arr) = 0x28eb90, ptr = 0x169d7cb0
b = 0x11 60 00 00 00 00 00 00 90 eb 28 00 00 00 00 00
MyArrayPtr(Arr) = 0x169d7cb0

这样一个简单的转换,我们就可以不需要API函数VarPtrArray 了。

本文分享自微信公众号 - VBA 学习(xyjvba),作者:熊业军

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • VBA数据类型Variant

    官方文档定义:A special data type that can contain numeric, string, or date data as wel...

    xyj
  • VBA指针Pointer

    与VarPtr得到的变量地址(假设是pv)关系是,pv这个地址保存的4个字节(32位电脑)的值就是ps。

    xyj
  • VBA数据类型String

    前面说到的指针Pointer,其实主要是说了取地址函数。得到了变量的地址,只能赋值给Long类型,并没有指针的作用,无法根据这个记录了变量地址的东西来操作变量。...

    xyj
  • Tensorflow学习笔记---人脸识别DEMO实现

    我被狗咬了
  • SpringBoot与Web开发

    用户1112962
  • php使用gearman进行任务分发操作实例详解

    本文实例讲述了php使用gearman进行任务分发操作。分享给大家供大家参考,具体如下:

    砸漏
  • 一篇文章教你读懂UI绘制流程我的Android重构之旅:框架篇

    在我们开发的初期往往并不需要什么框架,因为 Android Framework 良好的容错性帮助我们避免了很多问题,甚至你不需要深入的学习就可以写出一个较为完善...

    Android技术干货分享
  • WordPress 免插件生成最安全的纯静态站点地图(sitemap.xml)

    之前酷猫一直使用的是插件生成站点地图的方法,但是用来用去还是各种的不舒服,想了想还是免插件生成最好了,安全还高效!

    叮当叮
  • JSONP原理及使用

    首先提一下JSON这个概念,JSON是一种轻量级的数据传输格式,被广泛应用于当前Web应用中。JSON格式数据的编码和解析基本在所有主流语言中都被实现,所以现在...

    yaphetsfang
  • 码云推荐 | 基于 Bootstrap 实现通用后台管理系统 zhengAdmin

    基于 Bootstrap 实现的响应式 Material Design 风格的通用后台管理系统 https://gitee.com/shuzheng/zheng...

    码云Gitee

扫码关注云+社区

领取腾讯云代金券