下面给出了转换函数:GetCharByte得到一个字符的高字节或低字节,它的第一个参数是一个字符的ASCII码,第二个参数是标志取高字节还是低字节;StrToByte按DBCS或ANSI格式将一个字符串转换成一个字节数组,第一个参数是待转换的字符串,第二个参数是转换后的一个定长字节数组,若该数组长度不足以存放整个字符串,则截去超长的部分;ChangeStrAryToByte利用前两个函数将字符串数组转换成字节数组,第一个参数是定长的字符串数组,其中每个元素都是一个字符串(各个元素包含的字符数可以不同),第二个参数是一个变长的字节数组,保存转换后的结果。
FunctionGetCharByte(ByValOneCharAsInteger,ByValIsHighByteAsBoolean)AsByte'该函数获得一个字符的高字节或低字节
IfIsHighByteThen
IfOneChar>=0Then
GetCharByte=CByte(OneChar\256)
'右移8位,得到高字节
Else
GetCharByte=CByte((OneChar
And&H7FFF)\256)Or&H80
EndIf
ExitFunction
Else
GetCharByte=CByte(OneCharAnd&HFF)
'屏蔽掉高字节,得到低字节
ExitFunction
EndIf
EndFunction
SubStrToByte(StrToChangeAsString,ByteArray()AsByte)
'该函数将一个字符串转换成字节数组
DimLowBound,UpBoundAsInteger
Dimi,count,lengthAsInteger
DimOneCharAsInteger
count=0
length=Len(StrToChange)
LowBound=LBound(ByteArray)
UpBound=UBound(ByteArray)
Fori=LowBoundToUpBound
ByteArray(i)=0'初始化字节数组
Next
Fori=LowBoundToUpBound
count=count+1
Ifcount<=lengthThen
OneChar=Asc(Mid(StrToChange,count,1))
If(OneChar>255)Or(OneChar<0)Then
'该字符是非ASCII字符
ByteArray(i)=GetCharByte(OneChar,True)'得到高字节
i=i+1
Ifi<=UpBoundThenByteArray(i)
=GetCharByte(OneChar,False)
'得到低字节
Else
'该字符是ASCII字符
ByteArray(i)=OneChar
EndIf
Else
ExitFor
EndIf
Next
EndSub
SubChangeStrAryToByte(StrAry()
AsString,ByteAry()AsByte)
'将字符串数组转换成字节数组
DimLowBound,UpBoundAsInteger
Dimi,count,StartPos,MaxLenAsInteger
DimTmpByte()AsByte
LowBound=LBound(StrAry)
UpBound=UBound(StrAry)
count=0
ReDimByteAry(0)
Fori=LowBoundToUpBound
MaxLen=LenB(StrAry(i))
ReDimTmpByte(MaxLen+1)
ReDimPreserveByteAry(count+MaxLen+1)
CallStrToByte(StrAry(i),TmpByte)'转换一个字符串
StartPos=count
Do
ByteAry(count)=TmpByte(count-StartPos)
count=count+1
IfByteAry(count-1)=0ThenExitDo
Loop'将每一个字符串对应
的字节数组按顺序填入结果数组中
ReDimPreserveByteAry(count-1)
Nexti
EndSub
下面看一个转换的例子:
DimResultAry()asByte
DimSomeStr(2)asString
SomeStr(0)='测试1'
SomeStr(1)='测试222'
SomeStr(2)='测试33'
CallChangeStrAryToByte
(SomeStr,ResultAry)'转换字符串数组
当转换完成以后,查看字节数组ResultAry,其中包含了21个元素,依次是:178,226,202,212,49,0,178,226,202,212,50,50,50,0,178,226,202,212,51,51,0。其中,[178,226]是'测'的字节码,[202,112]是'试'的字节码,49,50,51分别为字符1、2、3的ASCII码。可见,经过转换后,字符串数组中的各个元素按顺序放在了字节数组中,相互间以终止符0分隔。
这样,字符串数组就全部转换成了字节数组,然后只要将字节数组的第一个元素以传址的方式传入动态连接库,DLL过程就可以正确地访问数组中的所有字符串了。但是,使用这种方法,当DLL过程处理结束返回VB时,VB得到的仍然是字节数组。如果需要在VB中再次得到该字节数组表示的字符串,还要把整个字节数组重新以0为分割符分成多个子数组(每个子数组都对应原来字符串数组中的一个元素),然后使用VB函数StrConv将每个子数组转换成字符串(转换时第二个参数选vbUnicode),就可以显示或进行其它操作了。例如,其中一个子数组的名字是SubAry,则函数StrConv(SubAry,vbUnicode)就返回了它所对应的字符串。