什么是BSTR数据类型?

在微软的官方文档中有这么一句话:

Strings in Visual Basic are stored as BSTR’s

在vba中字符串是以BSTR类型存储的。

BSTR的C++声明如下:

typedef WCHAR OLECHAR;
typedef OLECHAR* BSTR;
typedef BSTR* LPBSTR;

从声明可以看出BSTR是一个指向WCHAR类型变量的指针。

以下是BSTR的官方解释:

A BSTR is a composite data type that consists of a length prefix, a data string, and a terminator. 

BSTR是一个复合的数据类型,它由字符串长度+字符串+结束符组成。

下表详细地解释了BSTR的各个组成部分:

部分 说明
Length prefix

长度前缀

A four-byte integer that contains the number of bytes in the following data string. It appears immediately before the first character of the data string. This value does not include the terminator.

一个4字节的整数,存储的是实际的不含结尾Null字符的字符串的字节数。它位于字符串中的第一个字符之前。

Data string

字符串

A string of Unicode characters. May contain multiple embedded null characters.

Unicode字符组成的字符串,这个字符串可以包含很多Null字符。

Terminator

结束符

A NULL (0x0000) WCHAR.

一个Null字符(2个字节存储)

A BSTR is a pointer. The pointer points to the first character of the data string, not to the length prefix.

BSTR是一个指针,它指向的是字符串的第一个字符所在的内存地址,并不是指向字符串的长度。

如果要在vb中返回字符串变量存储的字符串的第一个字符的内存地址,需要用vb中的内置函数StrPtr。

如果用函数VarPtr则返回的是字符串变量的内存地址。

代码如下:

Sub QQ1722187970()
    Dim str1 As String
    str1 = "asdf"
    '返回变量str1的内存地址
    Debug.Print VarPtr(str1)
    '返回字符a的内存地址
    Debug.Print StrPtr(str1)
End Sub

图示如下:

为了验证以上观点,我们用CopyMemory函数来验证下。

假设字符串”abc”,它的字节数为6,现在用以下代码来取它的字节数:

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
Sub QQ1722187970()
    Dim str1 As String
    str1 = "abc"
    '定义一个变量用来存储字符串变量str1的字符串字节数
    Dim i As Long
    CopyMemory VarPtr(i), StrPtr(str1) - 4, 4
    Debug.Print i
End Sub

立即窗户输出的变量i的值为6,正好是”abc”字符串的字节数。

 

 

 

 

 

 

       

发表评论