一、bug的汇报
前两天VeryCD 无敌帅哥 kafeifei 给我汇报了一个easyMule的bug,他用 easyMule 下载电影的时候,想把他的文件直接下载到他的另一个机器的空闲硬盘上,所以他用了网络映射驱动器(映射了远程机器的一个目录作为一个虚拟驱动器),但是当他新建下载任务的时候发现无法选择目录到这个映射驱动器的目录中,因为目录选择对话框中压根就不显示此网络驱动器...
二、查找代码
在 easyMule 中有几处逻辑需要选择文件系统目录
1) 新建对话框的时候选择文件的最终下载目录
CDlgAddTask::OnBnClickedBnBrowse()
2)程序选项中配置默认的文件下载目录
CPPgDirectories::OnBnClickedSelincdir()
3)导入未完成的下载任务的时候需要选择目录
void ImportUnfinishedTasks(void)
三、问题分析
最终这三处都要调用 Otherfunctions.cpp 中封装的一个 SelectDir 函数 SelectDir(HWND hWnd, LPTSTR pszPath, LPCTSTR pszTitle, LPCTSTR pszDlgTitle, BOOL bHasNewFolderBn)
SelectDir具体实现是封装了windows的一个 API:
LPITEMIDLIST SHBrowseForFolder( LPBROWSEINFO lpbi);
SHBrowseForFolder 传入的参数是必须是一个 BROWSEINFO 结构体指针,在 BrsInfo.ulFlags 中设定可选的目录显示控制
按 MSDN 中的解释是用 BIF_SHAREABLE 来控制是否远程系统共享的资源文件夹,
0x8000. Version 5.0. The browse dialog box can display shareable resources on remote systems. This is intended for applications that want to expose remote shares on a local system. The BIF_NEWDIALOGSTYLE flag must also be set."
但很奇怪的是原来的代码添加了这个标志后,在选择的目录列表中不显示网络映射驱动器,后来我干脆把这个标志去了,反而显示了网络映射驱动器...
这可把我郁闷坏了,我想应该是微软的一个bug吧,怎么反了呢?
所以搜索了一下互联网,还真在msdn forum上找到一个和我有相同疑问的帖子... http://forums.msdn.microsoft.com/zh-CN/vcg...6c21811/
四、问题存疑
不过也可以换一个解释,提供 BIF_SHAREABLE 控制的本意是“可被分享的文件夹或目录才显示”,而被映射的网络驱动器是不可再分享的,所以如果加了 BIF_SHAREABLE 标志后,选择列表中就会过滤掉网络映射驱动器




























