C++ Builder SelectDirectory 中文目录过长无法选择的问题
2014-06-13 10:43
281 查看
使用C++ Builder SelectDirectory无法选择超过128位的中文目录。而WIN系统下目录最长支持260位(含0),这是不正常的。
SelectDirectory也是使用WIN API 如SHBrowseForFolder 实现的,查看shlobj.h发现如下代码:
可以看出WIN API支持ASCI及Wide Char(即unicode)两系列函数,由此推测SelectDirectory使用的是ASCI系列函数。故自定义一个SelectDir如下:
SelectDirectory也是使用WIN API 如SHBrowseForFolder 实现的,查看shlobj.h发现如下代码:
SHSTDAPI_(LPITEMIDLIST) SHBrowseForFolderA(LPBROWSEINFOA lpbi); SHSTDAPI_(LPITEMIDLIST) SHBrowseForFolderW(LPBROWSEINFOW lpbi);
可以看出WIN API支持ASCI及Wide Char(即unicode)两系列函数,由此推测SelectDirectory使用的是ASCI系列函数。故自定义一个SelectDir如下:
bool TForm1::SelectDir(const AnsiString Caption, const WideString Root, AnsiString &Dir) { #define PATH_MAX_LENGTH 260 //WIN7最长260 //使用wchar系列的API,以适应中文环境 wchar_t* PathBuf = new wchar_t[PATH_MAX_LENGTH]; BROWSEINFOW bi; memset(&bi, 0x00, sizeof(bi)); wmemset(PathBuf, 0x0000, PATH_MAX_LENGTH); bi.hwndOwner = this->Handle; bi.pidlRoot = NULL; // 没有使用Root参数 bi.pszDisplayName = PathBuf; bi.lpszTitle = WideString(Caption); bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; bi.lpfn = 0; LPITEMIDLIST pidl = SHBrowseForFolderW(&bi); if (pidl) { SHGetPathFromIDListW(pidl, PathBuf); /* wchar_t* -> asic char * -> AnsiString */ int nAsciLen = WideCharToMultiByte(CP_ACP, 0, PathBuf, -1, NULL, 0, NULL, NULL); if (0 == nAsciLen) { delete [] PathBuf; return false; } char *pAsci = new char[nAsciLen + 1]; WideCharToMultiByte(CP_ACP, 0, PathBuf, wcslen(PathBuf) + 1, pAsci, nAsciLen, NULL, NULL); //+1要算上尾0 Dir = (AnsiString)(pAsci); delete [] PathBuf; delete [] pAsci; return true; } delete [] PathBuf; return false; }
相关文章推荐
- 安卓系统浏览器中select下拉按钮无法弹出选择面板奇怪问题解决
- 在windows下的qt5.7.1 的纯C或C++项目命令行中文乱码、无法编译等问题解决
- 解决SVN安装语言包后无法选择中文的问题
- Cmder- ls 命令无法显示中文目录问题
- ftpClient.makeDirectory(path) 一直返回false,无法创建目录的问题
- [C++] cout、wcout无法正常输出中文字符问题的深入调查(2):VC2005的crt源码分析
- ftp文件上传,可以上传至非根目录的指定目录,并解决文件中文无法上传问题,返回文件路径
- [C++] cout、wcout无法正常输出中文字符问题的深入调查(1):各种编译器测试
- ubuntu16.04在英文状态下安装中文语言包的过程(法一:图形界面的方式) 以及 安装中文语言包后无法选择汉语问题的解决
- Cmder- ls 命令无法显示中文目录问题
- 安卓系统浏览器中select下拉按钮无法弹出选择面板奇怪问题解决
- 解决SVN安装语言包后无法选择中文的问题
- 框架的子页面中,目录在第二层,无法第二次提交的问题
- 关于在Word中无法设置中文效果问题
- sql server 2005 无法输入汉字、中文的问题.
- 无法在 SQL Server 2005 Manger Studio 中录入中文的问题
- office2003中WORD中visio图无法打印中文问题解决方法
- JSP+MySQL 无法插入中文问题(Data too long ...)
- 无法使用前导 .. 在顶级目录上退出(Cannot use a leading .. to exit above the top directory)
- web应用程序bin目录下的dll无法加载问题解决方法