无法识别空终止字符
null terminated character is not recognized
我使用 OPENFILENAME ofn 方式在 win32 应用程序中打开浏览文件对话框。
我希望能够根据用户需要使用动态文件过滤,而不是对所有文件进行预定义
ofn.lpstrFilter = L"All Files[=10=]*.*[=10=][=10=]";
我试图用动态代码更改预定义代码,但似乎在下面的代码中甚至以空字符结尾的字符也被视为字符串
string UserChoice = "Exe Files[=11=]*.exe[=11=][=11=]";
wstring ChoiceTemp = s2ws(UserChoice); // convert string to lpcwstr
LPCWSTR FilterByUser = ChoiceTemp.c_str();
ofn.lpstrFilter = FilterByUser;
似乎在浏览文件对话框中 \0 未被识别为空字符,它根本不显示任何文件,我对 C++ 的了解才刚刚起步,我无法让它工作在没有任何帮助的情况下,我在网上进行了搜索,但没有派上用场。
关于如何让它工作有什么建议吗?
您可以使用 std::string
for strings with embedded terminators, but you have to use the correct std::string
constructor 创建字符串。
更具体地说,您可以明确指定长度(链接构造函数参考中的数字 4)或开始和结束迭代器(数字 6)。在这种情况下,第一个最好:
string UserChoice("Exe Files[=10=]*.exe[=10=]", 16);
lpstrFilter
通常是常量字符串,因此不需要 std::wstring
。定义一个常量字符串即可:
const wchar_t* filter =
L"All files[=10=]*.*[=10=]"
L"Exe files[=10=]*.exe[=10=]";
但如有必要,可以按如下方式完成(我在重复@Joachim Pileborg)
std::wstring filter =
L"All files|*.*|"
L"Exe files|*.exe|";
std::replace(filter.begin(), filter.end(), '|', '[=11=]');
ofn.lpstrFilter = filter.data();
使用 filter.data()
而不是 c_str()
。要 select 特定过滤器,请使用 nFilterIndex
wchar_t filename[MAX_PATH];
wcscpy_s(filename, L"c:\test\default file.txt");
OPENFILENAME ofn = { sizeof(OPENFILENAME) };
ofn.lpstrFile = filename;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = filter;
ofn.nFilterIndex = 2; //select "Exe files"
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
我使用 OPENFILENAME ofn 方式在 win32 应用程序中打开浏览文件对话框。
我希望能够根据用户需要使用动态文件过滤,而不是对所有文件进行预定义
ofn.lpstrFilter = L"All Files[=10=]*.*[=10=][=10=]";
我试图用动态代码更改预定义代码,但似乎在下面的代码中甚至以空字符结尾的字符也被视为字符串
string UserChoice = "Exe Files[=11=]*.exe[=11=][=11=]";
wstring ChoiceTemp = s2ws(UserChoice); // convert string to lpcwstr
LPCWSTR FilterByUser = ChoiceTemp.c_str();
ofn.lpstrFilter = FilterByUser;
似乎在浏览文件对话框中 \0 未被识别为空字符,它根本不显示任何文件,我对 C++ 的了解才刚刚起步,我无法让它工作在没有任何帮助的情况下,我在网上进行了搜索,但没有派上用场。
关于如何让它工作有什么建议吗?
您可以使用 std::string
for strings with embedded terminators, but you have to use the correct std::string
constructor 创建字符串。
更具体地说,您可以明确指定长度(链接构造函数参考中的数字 4)或开始和结束迭代器(数字 6)。在这种情况下,第一个最好:
string UserChoice("Exe Files[=10=]*.exe[=10=]", 16);
lpstrFilter
通常是常量字符串,因此不需要 std::wstring
。定义一个常量字符串即可:
const wchar_t* filter =
L"All files[=10=]*.*[=10=]"
L"Exe files[=10=]*.exe[=10=]";
但如有必要,可以按如下方式完成(我在重复@Joachim Pileborg)
std::wstring filter =
L"All files|*.*|"
L"Exe files|*.exe|";
std::replace(filter.begin(), filter.end(), '|', '[=11=]');
ofn.lpstrFilter = filter.data();
使用 filter.data()
而不是 c_str()
。要 select 特定过滤器,请使用 nFilterIndex
wchar_t filename[MAX_PATH];
wcscpy_s(filename, L"c:\test\default file.txt");
OPENFILENAME ofn = { sizeof(OPENFILENAME) };
ofn.lpstrFile = filename;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = filter;
ofn.nFilterIndex = 2; //select "Exe files"
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;