问整个数组。这不能不说是VB的一个不足。因此,在程序设计中,如果确实需要将整个字符串数组传入动态库,就必须采取其它方法。
我们知道,在VB中,有一种Byte数据类型。每个Byte型变量占一个字节,不含符号位,因 此所能表示的范围为0到255。这种数据类型是专门用于存放二进制数据的。为了将整个字符 串数组传进动态库,可以用字节数组来保存字符串。由于Byte是一种简单数据类型,因此字节 数组的传递是非常简单的。首先,需要把一个字符串正确地转变成一个字节数组。这要涉及一 些字符集的知识。Windows 95和VB使用不同的字符集,Windows 95 API使用的是ANSI或DBCS 字符集,而VB使用的则是Unicode字符集。所谓ANSI字符集,是指每个字符都用一个字节表示, 因此最多只能有28=256个不同的字符,这对于英语来说已经足够了,但不能完全支持其它语 言。DBCS字符集支持很多不同的东亚语言,如汉语、日语和朝鲜语,它使用数字0-255表示ASCII 字符,其它大于255或小于0的数字表明该字符属于非拉丁字符集;在DBCS中,ASCII字符的长 度是一个字节,而汉语、日语和其它东亚字符的长度是2个字节。而Unicode字符集则完全用 两个字节表示一个字符,因此最多可以表示216=65536个不同字符。也就是说,ANSI字符集中 所有的字符都只占一个字节,DBCS字符集中ASCII字符占一个字节,汉字占两个字节,Unicode 字符集中每个字符都占两个字节。由于VB与WindowsAPI使用的字符集不同,因此在进行字符 串到字节数组的转换时,当用Asc函数取得一个字符的字节码后,需要判断它是否是一个ASCII 字符;如果是ASCII字符,则在转换后的字节数组中就只占一个字节,否则要占两个字节。
下面给出了转换函数:GetChar Byte得到一个字符的高字节或低字节,它的第一个参数 是一个字符的ASCII码,第二个参数是标志取高字节还是低字节;StrToByte按DBCS或ANSI格 式将一个字符串转换成一个字节数组,第一个参数是待转换的字符串,第二个参数是转换后的一个定长字节数组,若该数组长度不足以存放整个字符串,则截去超长的部分;ChangeStrAryToByte 利用前两个函数将字符串数组转换成字节数组,第一个参数是定长的字符串数组,其中每个元素都是一个字符串(各个元素包含的字符数可以不同),第二个参数是一个变长的字节数组, 保存转换后的结果。
Function GetCharByte(ByVal OneChar As Integer, ByVal IsHighByte As Boolean) As Byte '' 该函数获得一个字符的高字节或低字节
If IsHighByte Then
If OneChar >= 0 Then
GetCharByte = CByte(OneChar \ 256)
''右移8位,得到高字节
Else
GetCharByte = CByte((OneChar
And &H7FFF) \ 256) Or &H80
End If
Exit Function
Else
GetCharByte = CByte(OneChar And &HFF)
''屏蔽掉高字节,得到低字节
Exit Function
End If
End Function
Sub StrToByte(StrToChange As String, ByteArray() As Byte)
''该函数将一个字符串转换成字节数组
Dim LowBound, UpBound As Integer
Dim i, count, length As Integer
Dim OneChar As Integer
count = 0
length = Len(StrToChange)
LowBound = LBound(ByteArray)
UpBound = UBound(ByteArray)
For i = LowBound To UpBound
ByteArray(i) = 0 ''初始化字节数组
Next
For i = LowBound To UpBound
count = count + 1
If count <= length Then
OneChar = Asc(Mid(StrToChange, count, 1))
If (OneChar > 255) Or (OneChar < 0) Then
''该字符是非ASCII字符
ByteArray(i) = GetCharByte(OneChar, True) ''得到高字节
i = i + 1
If i <= UpBound Then ByteArray(i)
= GetCharByte(OneChar, False)
''得到低字节
Else
''该字符是ASCII字符
ByteArray(i) = OneChar
End If
Else
Exit For
End If
Next
End Su