有一段过程的代码求解,哪位高手帮我解释一下啊,谢谢!
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

解决方案 »

  1.   

    SHBrowseForFolder是显示浏览文件夹对话框,该函数需要一个BROWSEINFO结构作为参数,SHGetPathFromIDList是把用户选择的文件夹转换为路径字符串的形式。
      

  2.   

    使用SHBrowseForFolder来新建一个文件对话框,和VB6.0的标准对话框COMM对比,它只能被用户选取文件夹,
    而这也是这段代码的优势所在,标准COMM不能干这事,它只能让用户选择文件,DirPath 将返回用户选择的文件夹完整路径
      

  3.   

    这句TempStr = String$(255, Chr$(0)) 是什么含义?谁能帮忙解决啊?非常感谢!
      

  4.   

    用255个字符chr(0)填充字符串,以便执行DirPath = Left$(TempStr, InStr(TempStr, Chr$(0)) - 1).
    原因是API函数中,很多时侯是以chr(0)表示字符串结束的.
      

  5.   

    这句DirPath = Left$(TempStr, InStr(TempStr, Chr$(0)) - 1)又是什么意思呢?
      

  6.   

    我说过了,API函数中大多是用 “\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自动转换处理。