|
VB里面使用的字符串String就是COM规范中的BSTR,其特点是缓冲区前面有4字节的前缀用于说明缓冲区的长度:

因此这种结构可以保证能包含任意的内容,包括LPSTR中用于标志字符串结束的NULL.
VB在向API中以ByVal方式传递String时,实际上是把缓冲区的地址传了进去,因此API可以通过这个缓冲区来修改字符串内容.
以下这个代码可以直观的展示上面的说明:
- Option Explicit
- '说明BSTR结构的测试代码
- 'BY 嗷嗷叫的老马
- Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
- ByVal Destination As Long, _
- ByVal Source As Long, _
- ByVal Length As Long)
- Sub Main()
- Dim I As String, J As Long, K As Long
-
- I = "12345"
- Call CopyMemory(VarPtr(J), StrPtr(I) - 4, 4) '-4,指针就指向了I的前缀
- MsgBox "字符串A" & Chr(0) & "字符串B"
- 'MsgBox也是以NULL为字符串结尾的,因此无法显示出字符串B.
- MsgBox "缓冲区地址 = &H" & Hex(StrPtr(I)) & vbCrLf & vbCrLf & _
- "LenB(BSTR) = " & LenB(I) & vbCrLf & vbCrLf & _
- "CopyMemory得到的长度 = " & J
- End Sub
复制代码 |
-
【原创】VB中BSTR字符串的结构
|