您的位置:首页 > 编程语言 > C语言/C++

C++ Builder SelectDirectory 中文目录过长无法选择的问题

2014-06-13 10:43 281 查看
使用C++ Builder SelectDirectory无法选择超过128位的中文目录。而WIN系统下目录最长支持260位(含0),这是不正常的。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐