SHBrowseForFolder设置默认路径问题?(急)
以下是调用SHBrowseForFolder函数弹出窗口时,直接跳到特定路径的函数;
'vDefaultPath:这个是特定路径的设置值
Public Function BrowseFolder(ByVal hwnd As Long, ByVal Title As String, ByVal vDefaultPath As String) As String
Dim bi As BROWSEINFO
Dim rtn, pid As Long
Dim Path As String * 512
Dim pos As Integer
Dim ret As Long
With bi
.hOwner = hwnd
.ulFlags = BIF_NEWDIALOGSTYLE + BIF_EDITBOX + BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN 'BIF_RETURNONLYFSDIRS Or
.lpszTitle = Title
.lpfn = MyAddressOf(AddressOf BrowseForFolders_CallbackProc)
ret = LocalAlloc(LPTR, VBA.Len(vDefaultPath) + 1)
CopyMemory ByVal ret, ByVal vDefaultPath, VBA.Len(vDefaultPath) + 1
.lParam = ret
End With
pid = SHBrowseForFolder(bi)
rtn = SHGetPathFromIDList(ByVal pid, ByVal Path)
If rtn Then
pos = InStr(Path, Chr(0))
BrowseFolder = Left(Path, pos - 1)
Else
BrowseFolder = ""
End If
End Function
现在的问题是,如果路径设置比较潜,该函数运行正常,否则无效。具体多路径中最大包含多少字符以上,该函数失效,现暂时未做统计。
比如:如果设置为 "D:\tmp\tmp",就可以
否则如果是 "d:\tmp\渠道广告\新建文件夹\新建文件夹\新建文件夹\新建文件夹\渠道广告"则不行了。
问题点数:100、回复次数:11Top
1 楼Modest(塞北雪貂)·(偶最欣赏楼主的分)回复于 2006-03-01 14:46:26 得分 5
转换成短文件名试试Top
2 楼rainstormmaster(暴风雨 v2.0)回复于 2006-03-01 15:27:11 得分 25
先引用 Microsoft Shell Controls And Automation:
Private Sub Command1_Click()
Dim mshell As New Shell
Dim mfolder As Folder
Set mfolder = mshell.BrowseForFolder(Me.hWnd, "test", 1, "E:\mc\高级vb编程\PowerVB\Tools\Src")'参数1,可以改为你需要的flag,比如BIF_NEWDIALOGSTYLE + BIF_EDITBOX + BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN
If ObjPtr(mfolder) = 0 Then
Exit Sub
End If
MsgBox mfolder.Self.Path
End Sub
Top
3 楼lhfcsdn(http://shop33840643.taobao.com/)回复于 2006-03-02 09:10:38 得分 0
to rainstormmaster:
用您提供的方法,对默认路径深度或者说对默认路径字符总个数有没有限制?Top
4 楼rainstormmaster(暴风雨 v2.0)回复于 2006-03-02 14:32:49 得分 0
//用您提供的方法,对默认路径深度或者说对默认路径字符总个数有没有限制?
没试过,应该是没有额外的限制,不过,你要注意,windows对文件路径是有长度限制的Top
5 楼xinliangyu(yxl)回复于 2006-03-02 14:43:42 得分 70
楼主的问题不是出在路径的"深""浅"上,而是对双字节的汉字处理上的问题!
不妨把"D:\tmp\tmp"改为"D:\一",够"浅"吧,但问题会依旧!
在向API传字符串长度度的其他场合,我也遇到过同样的问题."通常"API应接收的是字节数,而
不是字符数.对于你的问题,可以这样:
改
ret = LocalAlloc(LPTR, VBA.Len(vDefaultPath) + 1)
为
ret = LocalAlloc(LPTR, VBA.LenB(StrConv(vDefaultPath, vbFromUnicode)) + 1)Top
6 楼xinliangyu(yxl)回复于 2006-03-03 10:13:13 得分 0
"急"楼主,问题解决了吧?Top
7 楼lhfcsdn(http://shop33840643.taobao.com/)回复于 2006-03-06 09:08:43 得分 0
to xinliangyu(yxl):
非常抱歉,这么晚才回你!
可以选择任意深度的目录了,但现在伴随出现一个棘手的错误:系统错误,“***产生了错误,会被windows关闭,您需要重新启动程序。 正在创建错误日志。”
Top
8 楼rainstormmaster(暴风雨 v2.0)回复于 2006-03-06 09:20:45 得分 0
//可以选择任意深度的目录了,但现在伴随出现一个棘手的错误:系统错误,“***产生了错误,会被windows关闭,您需要重新启动程序。 正在创建错误日志。”
可能是回调函数的问题,我不知道你不是有特殊的用途,如果只是选择文件夹的话,没必要回调Top
9 楼tongiii(索罗·希尔)回复于 2006-03-06 09:30:57 得分 0
关注一下Top
10 楼xinliangyu(yxl)回复于 2006-03-06 11:29:56 得分 0
回调中出"系统错误"不太好确定原因.使用shell对象,如rainstormmast的代码所示,也未为不可Top
11 楼lhfcsdn(http://shop33840643.taobao.com/)回复于 2006-03-06 13:13:33 得分 0
我把原来代码中的 LocalAlloc和copyMemory函数中的len都换成lenb后,问题解决。谢谢楼上各位了。Top




