有一段过程的代码求解,哪位高手帮我解释一下啊,谢谢!
Private Function ShowDir(MehWnd As Long, _
DirPath As String, _
Optional Title As String = "请选择文件夹:", _
Optional flage As Long = &H1, _
Optional DirID As Long) As Long
Dim BI As BROWSEINFO
Dim TempID As Long
Dim TempStr As String
TempStr = String$(255, Chr$(0))
With BI
.hOwner = MehWnd
.pidlRoot = 0
.lpszTitle = Title + Chr$(0)
.ulFlage = flage
End With
TempID = SHBrowseForFolder(BI)
DirID = TempID
If SHGetPathFromIDList(ByVal TempID, ByVal TempStr) Then
DirPath = Left$(TempStr, InStr(TempStr, Chr$(0)) - 1)
ShowDir = -1
Else
ShowDir = 0
End If
End Function
Private Function ShowDir(MehWnd As Long, _
DirPath As String, _
Optional Title As String = "请选择文件夹:", _
Optional flage As Long = &H1, _
Optional DirID As Long) As Long
Dim BI As BROWSEINFO
Dim TempID As Long
Dim TempStr As String
TempStr = String$(255, Chr$(0))
With BI
.hOwner = MehWnd
.pidlRoot = 0
.lpszTitle = Title + Chr$(0)
.ulFlage = flage
End With
TempID = SHBrowseForFolder(BI)
DirID = TempID
If SHGetPathFromIDList(ByVal TempID, ByVal TempStr) Then
DirPath = Left$(TempStr, InStr(TempStr, Chr$(0)) - 1)
ShowDir = -1
Else
ShowDir = 0
End If
End Function
而这也是这段代码的优势所在,标准COMM不能干这事,它只能让用户选择文件,DirPath 将返回用户选择的文件夹完整路径
原因是API函数中,很多时侯是以chr(0)表示字符串结束的.
比如使用GetTempPath这个API函数,在使用之前,你得准备足够的接收缓冲区(即字符串),如果你的缓冲区只有20个字节,而路径长度为30个字节,结果会怎么样?当然会错误。而如果你准备了1024个字节,而结果还是30个字节,结果又怎么样?你不能把整个1024个字节的内容都视作临时路径吧。于是,我们要根据chr(0)符号来进行判断,提取出我们真正需要的内容。所以,DirPath = Left$(TempStr, InStr(TempStr, Chr$(0)) - 1)这句其实是两个子句,即先用InStr(TempStr, Chr$(0))找到chr(0)所在的位置,然后再提取从左边开始,至这个位置的前一个字符为止的子串,这个子串就是SHGetPathFromIDList函数返回的真正结果。
至于字符编码问题,当使用Declare正确声明API时,会由VB自动转换处理。