4个回答
展开全部
当我们在VB中调用Win32 API函数时,如果函数的返回值是一个字符串,那一般有如下三种情况:
1. 函数预先要求你提供一个有固定空间的字符串,以供存储函数的返回值。
2. 函数的返回是一个以Null结尾的C字符串,而不是正规的VB字符串。
3. Win32 API函数有时候会返回另一种类型的字符串。这种类型的字符串在单个缓冲区内保存了多个字符串值,每个值之间用Null隔开,结尾的是两个Null,一个Null是最后一个字符串值的结尾符,另一个Null是整个字符串的结尾符。这其实就是我们通常在C中遇到的字符串数组。
第一种情况很好办,只无原则预先定义好一个空间足够大的字符串,然后把API函数的返回值赋于这个字符串就可以了。例如,如果你已经知道函数返回值最多不会走过256个字符,可以这样编码如下:
DimsAPIReturnas string
SAPIReturn=Space$(256)
SAPIReturn=API_Function(…)
对于第二和第三种情况,就必须把返回的C字符串成标准的VB字符串。下面这个函数CStringToVBString把一个以Null结尾的C字符串成VB字符串。
Public FunctionCStringToVBString(psCStringAs String)As string
'参数psCString是一个待转换的C字符串
'函数返回Null左边所有的字符
dimsReturnas string
dimiNullCharPosAs Integer
iNullCharPos=InStr(psCString,vbNullChar)
ifiNullCharPos >0then
sReturn =left(psCString, iNullCharPos -1)
else
sReturn =pscstring
end if
CStringToVBString=sReturn
End function
下面这个过程把一个含有多个C字符串的缓冲区转换成一个字符串数组。
Public SubMultiCStringToStringArray(psMultiCStringAs String, psaStrings()As String)
'参数psMultiCString是待转换的多个C字符串
'参数psaStrings是返回的VB字符串数组,调用之前它必须是一个动态的空数组
DimiNullPosAs Integer
DimiPrevPosAs Integer
DimiIdxAs Integer
'初始化字符串数组
iIdx =0
ReDimpsaStrings(0ToiIdx1)
psaStrings(iIdx1) =""
Do
iNullPos = InStr(iPrevPos1, psMultiCString, vbNullChar)
IfiNullPos > iPrevPos1Then
'把找到的C字符串赋值给字符串数组
psaStrings(iIdx) = Mid$(psMultiCString, (iPrevPos1), ((iNullPos -1) - iPrevPos))
iIdx = iIdx1
ReDim PreservepsaStrings(0ToiIdx)
iPrevPos = iNullPos
Else
'找到了两个Null字符,去掉最后一个,然后退出
ReDim PreservepsaStrings(0ToiIdx -1)
Exit Do
End If
Loop
End Sub
当调用Win32 API函数时,使用这两个简单的函数,你可以消除很多冗余的代码,加快开发步伐。
1. 函数预先要求你提供一个有固定空间的字符串,以供存储函数的返回值。
2. 函数的返回是一个以Null结尾的C字符串,而不是正规的VB字符串。
3. Win32 API函数有时候会返回另一种类型的字符串。这种类型的字符串在单个缓冲区内保存了多个字符串值,每个值之间用Null隔开,结尾的是两个Null,一个Null是最后一个字符串值的结尾符,另一个Null是整个字符串的结尾符。这其实就是我们通常在C中遇到的字符串数组。
第一种情况很好办,只无原则预先定义好一个空间足够大的字符串,然后把API函数的返回值赋于这个字符串就可以了。例如,如果你已经知道函数返回值最多不会走过256个字符,可以这样编码如下:
DimsAPIReturnas string
SAPIReturn=Space$(256)
SAPIReturn=API_Function(…)
对于第二和第三种情况,就必须把返回的C字符串成标准的VB字符串。下面这个函数CStringToVBString把一个以Null结尾的C字符串成VB字符串。
Public FunctionCStringToVBString(psCStringAs String)As string
'参数psCString是一个待转换的C字符串
'函数返回Null左边所有的字符
dimsReturnas string
dimiNullCharPosAs Integer
iNullCharPos=InStr(psCString,vbNullChar)
ifiNullCharPos >0then
sReturn =left(psCString, iNullCharPos -1)
else
sReturn =pscstring
end if
CStringToVBString=sReturn
End function
下面这个过程把一个含有多个C字符串的缓冲区转换成一个字符串数组。
Public SubMultiCStringToStringArray(psMultiCStringAs String, psaStrings()As String)
'参数psMultiCString是待转换的多个C字符串
'参数psaStrings是返回的VB字符串数组,调用之前它必须是一个动态的空数组
DimiNullPosAs Integer
DimiPrevPosAs Integer
DimiIdxAs Integer
'初始化字符串数组
iIdx =0
ReDimpsaStrings(0ToiIdx1)
psaStrings(iIdx1) =""
Do
iNullPos = InStr(iPrevPos1, psMultiCString, vbNullChar)
IfiNullPos > iPrevPos1Then
'把找到的C字符串赋值给字符串数组
psaStrings(iIdx) = Mid$(psMultiCString, (iPrevPos1), ((iNullPos -1) - iPrevPos))
iIdx = iIdx1
ReDim PreservepsaStrings(0ToiIdx)
iPrevPos = iNullPos
Else
'找到了两个Null字符,去掉最后一个,然后退出
ReDim PreservepsaStrings(0ToiIdx -1)
Exit Do
End If
Loop
End Sub
当调用Win32 API函数时,使用这两个简单的函数,你可以消除很多冗余的代码,加快开发步伐。
追问
我看过这篇文章,完全没重点,不知道讲什么
展开全部
当我们在VB中调用Win32 API函数时,如果函数的返回值是一个字符串,那一般有如下三种情况:
1. 函数预先要求你提供一个有固定空间的字符串,以供存储函数的返回值。
2. 函数的返回是一个以Null结尾的C字符串,而不是正规的VB字符串。
3. Win32 API函数有时候会返回另一种类型的字符串。这种类型的字符串在单个缓冲区内保存了多个字符串值,每个值之间用Null隔开,结尾的是两个Null,一个Null是最后一个字符串值的结尾符,另一个Null是整个字符串的结尾符。这其实就是我们通常在C中遇到的字符串数组。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Dim S As String, a() As Byte, S1 As String
S = "123456abcdef"
a = StrConv(S, vbFromUnicode) '字符串转换为字节数组
S1 = StrConv(a, vbUnicode) '字节数组转换为字符串
MsgBox S1
S = "123456abcdef"
a = StrConv(S, vbFromUnicode) '字符串转换为字节数组
S1 = StrConv(a, vbUnicode) '字节数组转换为字符串
MsgBox S1
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
何为字节数组?
追问
dim arr() as byte
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询