| 思考一下,第一个字符d的Unicode代码是00 64(十六进制),而在内存保存为64 00。StrConv将每一个字符转换为Unicode格式,结果就是00 64 00 00(在内存中则为64 00 00 00)。效果与在原来的每个Unicode字符后再加一个Unicode的空字节一样。
在将这个膨胀了的Unicode字符串传递到CharUpperW之前,Visual Basic欲把它转换为ANSI,于是它就变回原来的Unicode格式。于是CharUpperW就理解了传递进来的Unicode字符串,成功地将它改为大写。当转换为大写的Unicode字符串从CharUpperW返回的时候,Visual Basic又欲将它转换为Unicode,于是它又变为那种膨胀了的“Unicode“字符串。
字符串和Byte数组
Byte数组理所当然地就是成员是Byte类型的数组,例如:
Dim b(1 to 100) As Byte
我们可以使用VarPtr函数得到这个Byte类型的数组指针。
Dim lpsz As Long
lpsz = VarPtr(b(1))
数组第一个成员的地址就是数组的地址。
记得我们说过一个LPSTR就是一个指向空字节结尾的字符数组。现在我们把数组全部赋值为空:
For i = 1 To 100
b(i) = 0
Next
(虽然Visual Basic也会自动帮你初始化,但是老是依赖它的这种初始化功能却不是一个良好的编程习惯。)
在Byte数组和BSTR字符串间相互转化
要将一个BSTR字符串转化为Byte数组,我们有两种不同的方法。Visual Basic风格的方法如下:
Dim s As String
s = "help"
Dim b(1 To 8) As Byte
For i = 1 To 8
b(i) = AscB(MidB(s, i))
Next
另一种C++风格的方法可以是:
s = "help"
Dim b(1 To 8) As Byte
CopyMemory b(1), ByVal StrPtr(s), LenB(s)
不管是哪种方法,我们都得到:
104 0 101 0 108 0 112 0
从上可见,在每一个Unicode格式的字符串中,每个字符都是颠倒保存的。
另一方面,如果想把一个Byte数组转化为一个BSTR字符串,Visual Basic提供了几个函数帮助我们做到这一点。如果b是一个Unicode格式的Byte数组,那么我们就可以直接在代码中这样写:
Dim t As String
t = b
而如果是ANSI格式的Byte数组就这样写:
Dim t As String
t = StrConv(b, vbUnicode)
在BSTR和LPTSTR间进行转换
现在让我们来看一下如何在BSTR和LPTSTR间进行转换。
从BSTR到LPWSTR
将一个BSTR字符串转换为仿Unicode的Byte数组在理论上是很容易的。因为BSTR所指向的字符数组本来就是Unicode格式的。我们只要把字符一个个拷贝过去就行了。以下是一个将BSTR转换为LPWSTR的函数:
Function BSTRtoLPWSTR(sBSTR As String, b() As Byte, lpwsz As Long) As Long
'''' Input: a nonempty BSTR string
'''' Input: **undimensioned** byte array b()
'''' Output: Fills byte array b() with Unicode char string from sBSTR
'''' Output: Fills lpwsz with a pointer to b() array
'''' Returns byte count, not including terminating 2-byte Unicode null character
'''' Original BSTR is not affected
Dim cBytes As Long
cBytes = LenB(sBSTR)
'''' ReDim array, with space for terminating null
ReDim b(1 To cBytes + 2) As Byte
'''' Point to BSTR char array
上一页 [1] [2] [3] [4] [5] 下一页 |