VarPtr:返回变量地址
StrPtr:返回真正的UNICODE字符串缓冲区的地址
ObjPtr:返回任何对象变量引用的地址
下面是这三个函数的具体用法。
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=bTmpvb 字符串转数组
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,而对于空字符串,函数的返回值为非零。
VarPtr
该函数能与要求包含有UNICODE字符串的结构的API调用一起使用。如果将一个MyUDTVariable变量(一个自定义类型的变量)传递给一个由ByRef UDTParam As MyUDT定义的参数,就会发生ANSI/UNI
CODE之间的转换。但是,如果将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
ObjPtr
该函数返回由对象变量引用的接口指针。由于大多数对象都支持多重接口,因此搞清楚地址对应的是对象的哪一个接口就非常重要了。通常个函数用来放在集合中的对象。通过创建基于对象地址的关键字,你就可以在不需要启遍历整个集合中所有元素的情况下,轻松地将对象从集合中删除。在许多情况下,对象地址是唯一可靠的能作为关键字的东西,示
例如下:
ObjCol.Add MyObj1,CStr(ObjPtr(MyObj1))
.....
ObjCol.Remove CStr(ObjPtr(MyObj1))

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。