无法识别空终止字符

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;