打印本文 打印本文 关闭窗口 关闭窗口
有关API字符串--API programmer请看之二
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2948  更新时间:2009/4/23 18:58:16  文章录入:mintao  责任编辑:mintao
思考一下,第一个字符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]  下一页

打印本文 打印本文 关闭窗口 关闭窗口