VBA实现自己的ArrayPtr取数组地址函数
时间:2022-07-22
本文章向大家介绍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 了。
- VUE 入门基础(4)
- 实例演示Android异步加载图片
- 使用OData协议查询Windows日志
- Android之Notification介绍
- postcss-lazysprite: 一种生成CSS 雪碧图的懒惰姿势
- Activity间中使用Intent传值
- VUE 入门基础(3)
- ASP.NET MVC 2 转换工具
- 使用Sysinternals工具定时休眠Windows Server 2008 R2
- Android中BroadcastReceiver广播
- 启用Windows 7/2008 R2 XPS Viewer
- Spring历史版本变迁和如今的生态帝国
- Android中Services之异步IntentService
- 使用GitHub搭建个人博客
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法