excel中VarPtr、StrPtr 和 ObjPtr 函数的用法
发布时间:2022-06-30 05:21:29
一、发展历史
在 Basic 语言演变成 QBasic,然后到 Visual Basic 之前,VarPtr 函数就已经存在了。开始,这个函数存在于 VB 运行库 1.0 版中。通过声明可以调用这个函数:
Declare Function VarPtr Lib "vbrun100.dll" (Var As Any) As Long
数年之后,vbrun100.dll 变成了 msvbvm50.dll,但该函数的入口点却还在那儿。为了获取变量的地址,只须将变量名传递给该函数就行了。例如:
Dim l As Long
Debug.Print VarPtr(l)
类似地,为了获取字符串的指针,而非保存字符串的变量的指针,只须在变量名前加上 ByVal 即可。如:
Debug.Print VarPtr(s),VarPtr(ByVal s)
在VB3之前,用这种方法来获取字符串缓冲的指针是非常普遍的。但在VB4却遇到了一点麻烦。
ANSI/UNIDCODE问题
这种差异是如何影响 VarPtr 函数的呢?当一个字符串传递给 VarPtr 函数时,函数执行后所返回的地址是保存临时ANSI 字符串的临时 ANSI 字符串 或变量的地址。换句话说,这个地址并不是你声明的变量的真正地址。因此,对于字符串变量以及包括字符串的结构来讲,这个函数一点用也没有。
VB5来解决问题
为了能VarPtr能重新发挥作用,VB5 加入了三个针对 VBA 类型库的入口点。这些入口点为 VarPtr 函数提供了内置的声明。这三个函数的作用是:
VarPtr:返回变量地址
StrPtr:返回真正的 UNICODE 字符串缓冲区的地址
ObjPtr:返回任何对象变量引用的地址
二、下面是这三个函数的具体用法:
1、StrPtr
该函数主要用来产生高效的 UNICODE API 调用。在 VB4,UNICODE 形式的 API 函数的调用必须借助于 Byte 数组,例如:
Declare Sub MyUnicodeCall Lib "MyUnicodeDll.dll" (pStr as Byte)
Sub MakeCall(MyStr As String)
Dim bTmp() As Byte
bTmp = MyStr & vbNullChar
MyUnicodeCall bTmp(0)
MyStr = bTmp
MyStr = Left(MyStr, Len(MyStr) - 1)
End Sub
如果使用 StrPtr,上面的代码精简为:
Declare Sub MyUnicodeCall Lib "MyUnicodeDll.dll" (pStr as Byte)
Sub MakeCall(MyStr As String)
MyUnicodeCall StrPtr(MyStr)
End Sub
VarPtr/StrPtr/ObjPtr 的执行速度非常非常快,因此调用 UNICODE 函数所赞成有系统负担实际上小于调用相对应的ANSI函数。因为前者不需进行转换。
StrPtr 还能用于优化 ANSI API 函数的调用。在调用时使用 StrConv 和 StrPtr 就能避免将一个字符串变量多资传递给函数以及为每个调用而执行转换操作所造成的系统负担。例如原来的:
Declare Sub MyAnsiCall Lib "MyAnsiDll.dll" (ByVal pStr As String)
MyAnsiCall MyStr
现在变为:
Declare Sub MyAnsiCall Lib "MyAnsiDll.dll" (ByVal pStr As Long)
MyStr = StrConv(MyStr, vbFromUnicode)
MyAnsiCall StrPtr(MyStr)
MyStr = StrConv(MyStr, vbUnicode) '并不总是要求
StrPtr 还是唯一能直观地告诉你空字符串和 null 字符串的不同的方法。对于 null 字符串(vbNullString),StrPtr 的返回值为 0,而对于空字符串,函数的返回值为非零。
2、VarPtr
该函数能与要求包含有UNICODE字符串的结构的API调用一起使用。如果将一个 MyUDTVariable 变量(一个自定义类型的变量)传递给一个由 ByRef UDTParam As MyUDT定义的参数,就会发生 ANSI/UNICODE 之间的转换。但是,如果将 VarPtr(MyUDTVariable) 传递给由 ByVal UDTParam As Long 定义的参数,则不会发生这样的转换。
有一点需要特别注意,在VB中指针的算法非常重要。此外,你必须计算元素的大小,因为VB不会帮你完成这项工作。你还必须处理缺乏无符号长整型数据类型的问题。下面的函数实现了无符号算法
Function UnsingedAdd(ByVal Start As Long, ByVal Incr As Long) As Long
Const SignBit As Long = &H80000000
UnsignedAdd = (Start Xor SignBit) + Incr Xor SignBit
End Function
3、ObjPtr
该函数返回由对象变量引用的接口指针。由于大多数对象都支持多重接口,因此搞清楚地址对应的是对象的哪一个接口就非常重要了。通常个函数用来放在集合中的 对象。通过创建基于对象地址的关键字,你就可以在不需要启遍历整个集合中所有元素的情况下,轻松地将对象从集合中删除。在许多情况下,对象地址是唯一可靠 的能作为关键字的东西,示例如下:
ObjCol.Add MyObj1, CStr(ObjPtr(MyObj1))
'.....
ObjCol.Remove CStr(ObjPtr(MyObj1))
excel中VarPtr、StrPtr 和 ObjPtr 函数的用法的下载地址:


猜你喜欢
- PSD格式算是Photoshop是一种独有的图形文件格式,相信很多用户都有接触过,而很多用户在制作完psd文件之后,想把这个文件发给别人,却
- 现如今,不少Windows10系统用户为了方便下载,都希望能够将edge浏览器和迅雷软件关联起来。那么,这该如何操作呢?其实,现在最新版本的
- 升级win10后,点击要打开word怎么打不开了,提示对话框一个打叉,怎么解决?对于新手来说熟练运用Word还是有一定难度,怎么办?下面小编
- 有用户跟小编反映自己的电脑自动升级Win10系统之后,就老是叮咚响发出声响,这是怎么回事?小编判断可能是有设备一直中断连接导致的。下面就来看
- 1.选择需要进行限制数据的单元格,这里实例选择的是A列,限制用户只能输入A或B或C,然后点数据--数据有效性--数据有效性,会弹出数据有效性
- 刚才为大家介绍了Win8.1怎么升级到Win10,但是还有很多朋友对于Win8到Win10资源钥匙注册步骤,下面就和小编一起去看教程吧刚才为
- 迅捷视频转换器怎么用?迅捷视频转换器支持十几种常见的音频和视频格式,只需要将视频文件和音频文件导入到迅捷视频转换器就可以自动进行批量转换,那
- word更改图片大小和位置将图片插入到文档后,用户还可以对图片的大小、位置以及对其方式进行设置。1)更改图片大小若使用鼠标调整图片大小,则选
- 逍遥模拟器是款手游模拟器,具有优异的性能、兼容各类软件、硬件,可以运行市面上绝大部分主流游戏。近期有用户在使用逍遥模拟器时,出现应用程序闪退
- win10开机启动项怎么设置?最近有小伙伴们反映给小编说想知道win10系统怎么设置开机启动项,自己不知道应该如何设置。还不清楚的小伙伴们不
- 今天总结了一些Word中的阿拉伯数字小技巧供大家参考。技巧一:将阿拉伯数字转换成大写数字年终财务总结中的一些数字,按国人的习惯,通常用大写的
- 在整理图片过程中,有时我们需要对一系列图片做统一处理,为提高工作效率,我们可以适当使用一些方便操作的快捷键及手势。今天小编为大家带来的是Ma
- 网速不稳定是什么原因?很多用户在上网的时候,出现网速不稳定的情况,又不知道网速不稳定是什么原因,特别是无线网络出现不稳定的情况是非常普遍的。
- 今天,Windows Update和微软下载中心都已经开始提供Windows XP SP3下载,用户可以任意选择自动更新还是下载镜像。下载地
- WinXP系统电脑打开网上邻居就提示无法查看工作组计算机,这是怎么回事?XP系统电脑网上邻居一直提示无法查看工作组计算机该如何解决?请看下文
- Win7操作系统有着众多版本,在这其中就包含了精简版系统,其通过精简掉部分不常用的功能或组件,来达到提高系统运行速度或减小系统体积的目的,因
- word2007设置页码很多人都会,但是从任意页开始设置页码相信大多数人都不会,小编今天分享一下Word2007怎样从任意页开始设置页码的经
- 尽管现在智能手机那么普遍了,但是仍然有很多音乐爱好者喜欢用CD来听音乐,那么要如何把喜欢的歌曲变成音乐CD呢?本文就以Ones刻录工具来教大
- 说明OCT2DEC 函数将八进制数字转换为十进制数字。返回值十进制数字。语法=OCT2BIN(number)参数Number 必需。 要转换
- wps字体行间距怎么调整设置?对wps文件里的字间距进行调整统一,可以让整个文件排版看起来更规范整齐,那wps字体行间距要怎么调整?一起来看