| 一个长度为1的BSTR的字符串。该字符串是Unicode格式,所以占用2个字节。
Asc,AscB和AscW函数
这些函数就是Chr的反函数。其中,AscB接收一个ANSI BSTR类型的字符串,并返回一个Byte型的该字符串第一个字符的ASCII代码。为了证明返回值确是Byte类型的数据,请看下面的代码:
Debug.Print VarType(AscB("h")) = vbByte
输出结果是True。从字面上来看,可能你会认为AscB会接收一个BSTR类型的字符,但是,实际上它只认这个BSTR字符的第一个字节,其它的字节就被忽略掉了。
Asc函数接收一个BSTR类型的字符串(不是ANSI BSTR),并返回一个该字符串第一个字符的Unicode代码。
Null字符串和Null字符
Visual Basic允许Null值的BSTR类型字符串。请看下面代码:
Dim s As String
s = vbNullString
Debug.Print VarPtr(s) ‘有关这两个函数,接下来马上介绍。
Debug.Print StrPtr(s)
输出结果是:
1243948
0
这说明,一个Null值的BSTR字符串仅仅是一个指向内容为0的字符指针。在Win32和Visual C++中,这种字符串叫做空指针。让我们再来看看vbNullString和vbNullChar的区别。vbNullChar并不是指针,它是一个值为0的Unicode字符。
请大家不要把一个值为Null的BSTR和一个空BSTR搞混了。请看下面代码:
Dim s As String
Dim t As String
s = vbNullString
t = ""
空BSTR字符串t是一个指向非空内存地址的指针。在那个地址保存的是空BSTR字符串的终止符。而且,它前面的那4个保留字节中保存的该字符串的长度信息为0。
VarPtr和StrPtr函数
在微软的文档里并没有VarPtr和StrPtr函数的描述,但它们是非常有用的。特别是VarPtr函数。
请看,如果参数var为有效变量的话,那么,
VarPtr(var)
返回的是变量的长整型地址。如果str是一个BSTR字符串变量,那么:
StrPtr(str)
返回的是BSTR字符串指针指向的Unicode字符串的首地址。
让我们看下图:

Figure 6-5. A BSTR
如果代码如下:
Dim str As String
str = "help"
注意,变量str在内存中的地址是aaaa,str保存的内容是字符串的首地址xxxx.。
请看:
VarPtr = aaaa
StrPtr = xxxx
请再运行以下程序:
Dim lng As Long
Dim i As Integer
Dim s As String
Dim b(1 To 10) As Byte
Dim sp As Long, vp As Long
s = "help"
sp = StrPtr(s ) ’sp是字符串首地址即字符h在内存中的地址xxxx
Debug.Print "StrPtr:" & sp
vp = VarPtr(s) ‘vp是sp的保存的内容xxxx在内存中的地址aaaa
Debug.Print "VarPtr:" & vp
CopyMemory lng, ByVal vp, 4 ‘将长整型指针vp指向的内容xxxx拷贝到长整型变量lng,并作比较。
Debug.Print lng = sp
CopyMemory b(1), ByVal sp, 10 ‘将sp保存的地址的实际内容拷贝给byte型数组b(),并输出。
For i = 1 To 10
Debug.Print b(i)
Next
输出结果为:
StrPtr:1836612
VarPtr:1243988
True
104 0 101 0 108 0 112 0 0 0
在此我们清楚地看到,在内存中BSTR类型的字符串是以Unicode格式保存的。
请在这几行代码:
sp = StrPtr(s)
Debug.Print "StrPtr:" & sp
后加入以下几行代码:
Dim ct As Long
CopyMemory ct, ByVal sp - 4, 4
Debug.Print "Length field: " & ct
运行后可以得到这条输出结果:
Length field: 8
在此我们清楚地看到,这四个字节的保留字保存的是字符串的字节数,而不是字符数。
上一页 [1] [2] |