在VB中调用动态连接库

出处:www.examlink.com 作者:小罗 日期:2007年01月24日 14时23分

  下面给出了转换函数: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)就返回了它所对应的字符串。

最后更新时间:2008-05-28 11:40:52
文章评论
共有 0 位网友发表了评论
用户名: 新注册) 密码: 匿名评论 [查看所有评论]

评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
您可以用以下几种方式找到此文章

考试全流程