四、 字符串转换成VB字符串
当我们在VB中调用Win32 API函数时,如果函数的返回值是一个字符串,那一般有如下三种情况:
1. 函数预先要求你提供一个有固定空间的字符串,以供存储函数的返回值。
2. 函数的返回是一个以Null结尾的C字符串,而不是正规的VB字符串。
3. Win32 API函数有时候会返回另一种类型的字符串。这种类型的字符串在单个缓冲区内保存了多个字符串值,每个值之间用Null隔开,结尾的是两个Null,一个Null是最后一个字符串值的结尾符,另一个Null是整个字符串的结尾符。这其实就是我们通常在C中遇到的字符串数组。
第一种情况很好办,只无原则预先定义好一个空间足够大的字符串,然后把API函数的返回值赋于这个字符串就可以了。例如,如果你已经知道函数返回值最多不会走过256个字符,可以这样编码如下:
Dim sAPIReturn as string
SAPIReturn=Space$(256)
SAPIReturn=API_Function(…) | 对于第二和第三种情况,就必须把返回的C字符串成标准的VB字符串。下面这个函数CStringToVBString把一个以Null结尾的C字符串成VB字符串。
Public Function CStringToVBString(psCString As String) As string
‘参数psCString是一个待转换的C字符串
‘函数返回Null左边所有的字符
dim sReturn as string dim iNullCharPos As Integer
iNullCharPos=InStr(psCString,vbNullChar) if iNullCharPos >0 then sReturn =left(psCString, iNullCharPos -1) else sReturn =pscstring end if CStringToVBString=sReturn End function | 下面这个过程把一个含有多个C字符串的缓冲区转换成一个字符串数组。
Public Sub MultiCStringToStringArray(psMultiCString As String, psaStrings() As String)
'参数psMultiCString是待转换的多个C字符串 '参数psaStrings是返回的VB字符串数组,调用之前它必须是一个动态的空数组 '
Dim iNullPos As Integer Dim iPrevPos As Integer Dim iIdx As Integer
'初始化字符串数组
iIdx = 0 ReDim psaStrings(0 To iIdx + 1) psaStrings(iIdx + 1) = "" Do ' iNullPos = InStr(iPrevPos + 1, psMultiCString, vbNullChar) If iNullPos > iPrevPos + 1 Then '把找到的C字符串赋值给字符串数组 psaStrings(iIdx) = Mid$(psMultiCString, (iPrevPos + 1), ((iNullPos - 1) - iPrevPos)) iIdx = iIdx + 1 ReDim Preserve psaStrings(0 To iIdx) iPrevPos = iNullPos Else '找到了两个Null字符,去掉最后一个,然后退出 ReDim Preserve psaStrings(0 To iIdx - 1) Exit Do End If Loop End Sub | 当调用Win32 API函数时,使用这两个简单的函数,你可以消除很多冗余的代码,加快开发步伐。
注意:
当你为API的返回值预先分配字符串的空间时,一定不要忘了空间内必须包含Null结束符。另外,建议你在使用API时,最好对每个变量都进行声明,加上下面这句代码:
五、 小结
VB6中字节数组和字符串的相互转换是编程中,尤其是新手使用中最为头疼的问题。本文归纳了软件开发过程中使用二者的典型情况及其应该注意的问题,供参考。不当之处还请读者批评指正。
|
|